web-dev-qa-db-ja.com

jpaエラーは、関係属性のターゲットエンティティとして非エンティティ[クラスch.printsoft.mailhouse.usermgr.entity.Department]を使用します

DepartmentクラスとMandatorクラスをhsqhldbに永続化しようとしましたが、このエラーが発生します。

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;

私は本当にすべてを試しましたが、うまくいきませんでした。

18
Miguel Iglesias

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

あなたのpersistence.xmlを含めてください。

42
James

私はこの例外の一見説明できないケースのデバッグに多くの時間を費やしたので、ここに私の話を残しておきます。

JPAのやや古い実装(EclipseLink 2.5.xなど)を使用していて、コードベースで最新のJava 8つの機能(ラムダ式など)を使用している場合は、使用しないでください。 ever JPAエンティティクラスでそれらを使用します。

EclipseLink 2.5のクラスメタデータパーサーは、バイトコードでJava 8つの機能(ラムダ式、メソッド参照など))に遭遇するとクラッシュします。内部クラッシュは、非常に不親切ですArrayIndexOutOfBoundsException 、しかし、ウィーバーコードがサイレントにメタデータパーサーを無視し、クラスに興味深いメタデータがないと想定しているため、それを見ることができません。これは問題のクラスは、適切なアノテーションがすべて含まれていてもエンティティではないと信じ込ませ、最終的には、話しているエラーメッセージになります。

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

41
kFYatek

これが誰かを助けることができることを願っています。

私も同じ問題を抱えていました。前の晩、すべてが大丈夫だった。 NetBeansで、履歴を使用して、エラーに関係するすべてのファイルを確認しました。 Persistence.xmlが含まれています。何も変更されていません。

手動でも確認しました。このスレッドで提案されているすべてのソリューションを試してみましたが、eclipselink2.6.4に移行することもできます。 persistence.xmlに含まれる2つのクラスを削除して保存し、再度追加しました。エラーはまだありました。

次に、persistence.xmlに含まれているエンティティクラスのリストからすべてのクラスを削除してから、それらを再度含めました。

今では動作します。魔法のように。

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

3
docHell

Mandatorクラスの@OneToManyアノテーションからmappedByを削除します

関連するすべてのクラスが@Entityとしてマップされているかどうかを確認します。部門クラスには、DocumentUserと@ManyToManyの関係があります。 DocumentUserクラスのリストを提供します

1
WeMakeSoftware

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

0
Marcin Cinik

mappedBy=xxxを調べて、xxxがプロジェクト全体で一意であることを確認します。

0
WesternGun

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

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