2011-12-02 9 views
7

DepartmentおよびMandatorクラスをhsqhldbに保持しようとしましたが、このエラーが発生します。jpaエラーは、関係属性の対象エンティティとして非エンティティ[クラスch.printsoft.mailhouse.usermgr.entity.Department]を使用します

Exception Description: [class ch.printsoft.mailhouse.usermgr.entity.Mandator] uses a non-entity [class ch.printsoft.mailhouse.usermgr.entity.Department] as target entity in the relationship attribute [field departments]. 
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 
at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:115) 
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source) 

これらは私のデータベースに保持しようとするクラスです。私は本当に問題が何であるか分からない。

@Entity 
public class Mandator { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String mandatorId; 
    @OneToMany(mappedBy = "mandator") 
    private List<MandatorUser> mandatorUsers; 
    @OneToMany(mappedBy = "mandator") 
    private List<SLAFamilyGroup> slaFamilyGroups; 
    @OneToMany(mappedBy = "mandator") 
    private List<Group> groups; 
    @OneToMany(mappedBy = "mandator") 
    private List<Department> departments; 
    @OneToMany(mappedBy = "mandator") 
    private List<CostUnit> costUnits; 



@Entity 
    public class Department { 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 
    private String responsiblePerson; 
    private String location; 

    @ManyToOne(optional = false) 
    private Mandator mandator; 
    @ManyToMany 
    private List<DocumentUser> documentUsers; 

私は実際にすべてのことを試しましたが、うまくいきませんでした。

答えて

1

、関連するすべてのクラスが@Entityとしてマッピングされている場合は委任者クラスから@OneToMany注釈から

チェックをmappedByを削除します。 Departmentクラスは、DocumentUserに対して@ManyToManyの関係を持っています。 DocumentUserクラスのリストを提供する

+0

大丈夫です。 –

+0

例外の説明:[class ch.printsoft.mailhouse.usermgr.entity.Mandator]は、非エンティティ[class ch.printsoft.mailhouse.usermgr.entity.Department]を次のように使用します。関係属性[field departments]のターゲットエンティティ。 –

+0

Departmentクラスから、mandatorの@ManyToOneアノテーションから "optional = false"を削除 – WeMakeSoftware

31

persistence.xmlに両方のクラスがリストされ、両方のクラスがクラスパス上にあることを確認してください。

persistence.xmlを含めてください。

+0

ありがとうございます。私は物事を移動し、私のpersistence.xmlが更新されたことを確認するのを忘れました。あなたがそれが正しいと思っても、それをチェックしてください! :-) – woot

0

"class"ファイルが両方とも同じjarにあることを確認してください。 同じ名前の2つの.classファイルがないことを確認してください。

0

両方のクラスにPKのプロパティとnoパラメータコンストラクタがあることを確認してください。 私のエンティティクラスに次のコードを追加します。

@Entity 
public class EntityClass{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int id; 
    public EntityClass() { 
    } 
    ... 
} 
0

あなたmappedBy=xxxを調べ、xxxは、プロジェクト全体で一意であることを確認してください。

18

この例外の説明できないようなケースをデバッグするのに多くの時間を費やしただけなので、ここで私の話を残しています。

コードベースに現代のJava 8の機能(例えば、ラムダ式など)を使用していて、幾分古いJPA(EclipseLink 2.5.xなど)の実装を使用している場合 - を使用しないでくださいJPAエンティティクラスでは

バイトコード内でJava 8の機能(ラムダ式、メソッド参照など)が発生すると、EclipseLink 2.5のクラスメタデータパーサがクラッシュします。ウィーバーコードは、メタデータパーサーが黙って無視して、クラスには興味深いメタデータがないものと仮定しているため、内部クラッシュは非常に不都合なArrayIndexOutOfBoundsExceptionです。これは、問題のクラスがすべての適切な注釈を持っていても実体ではなく、最終結果が私たちが話しているエラーメッセージであると信じるようになります。

ボトムライン:Java 8ラムダをJPAエンティティクラスで使用しないでください。 EVER。

+1

全く同じprobを試して実行してください! probを修正したBOTTOM行のThx: -/ – LeO

+1

しかし、EclipseLink 2.6.4ではこの問題が修正され、現在はJPAがlambdaでうまくいきます!少なくとも私がテストしたもの;-) – LeO

+0

ありがとうkFYatek!私の場合、エンティティはJPAからの警告なしで(FINEログで!)、次にこの無視されたエンティティを指す@OneToManyでは、JPAは例外をスローします。 "エンティティAは非エンティティBを使用します)... 暗い雲の中で1時間失う方法.......:p 小さなラムダ式が失われました。それを置き換えた後、すべてが大丈夫です! – Elloco

1

私はこれが誰かを助けることを望みます。

私は同じ問題を抱えていました。 前の夜、すべてが大丈夫だった。 NetBeansでは、Historyに、エラーに関係するすべてのファイルをチェックしました。 Persistence.xmlが含まれています。 何も変更されていません。

私も手動でチェックしました。 このスレッドで提案されているすべてのソリューションを試しましたが、eclipselink 2.6.4に移行しました。 persistence.xmlに含まれる2つのクラスを削除し、保存してからもう一度追加しました。 エラーはまだありました。

次に、persistence.xmlに含まれるEntity Classesのリスト内のすべてのクラスを削除してから、それらを再度組み込みました。

これで機能します。 Magically。

しかし、実際には歴史に違いはありませんでした。 1文字ですら。

関連する問題