jpa错误使用非实体[class ch.printsoft.mailhouse.usermgr.entity.Department]作为关系属性中的目标实体

Mig*_*ias 17 persistence jpa eclipselink

我尝试将我的DepartmentMandator类持久化到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)
Run Code Online (Sandbox Code Playgroud)

这些是我尝试持久保存到我的数据库的类.我真的不知道问题是什么.

@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;
Run Code Online (Sandbox Code Playgroud)

我真的尝试了所有的东西,但它没有用.

Jam*_*mes 43

确保在persistence.xml中列出了这两个类,并且这两个类都在类路径中.

请包含您的persistence.xml.


kFY*_*tek 43

我只花了很多时间调试此异常的一个看似无法解释的情况下,所以我只是让我的故事在这里.

如果您使用的是稍微旧的实现JPA(如EclipseLink的2.5.X)和你在你的代码库使用现代的Java 8特性(比如lambda表达式) -不要永远使用它们在JPA实体类.

EclipseLink 2.5的类元数据解析器在遇到字节码中的Java 8功能(例如lambda表达式,方法引用等)时崩溃.内部崩溃是一个非常不友好的ArrayIndexOutOfBoundsException,但你甚至没有看到它,因为weaver代码默默地忽略元数据解析器崩溃,并假设该类没有有趣的元数据.这导致它相信所讨论的类不是实体,即使它具有所有正确的注释,最终结果是我们正在讨论的错误消息.

结论:不要在JPA实体类中使用Java 8 lambdas.EVER.

  • 但是EclipseLink 2.6.4修复了这个问题,现在JPA与lambdas一起工作了!至少我测试过的东西;-) (3认同)
  • 测试并遇到完全相同的问题!感谢修复了问题的底线:-/ (2认同)

小智 5

我希望这可以帮助某人。

我有同样的问题。前一天晚上,一切正常。在NetBeans中,我已使用“历史记录”检查了错误中涉及的所有文件。包含Persistence.xml。一切都没有改变。

我也手动检查过。我已经尝试了该线程中建议的所有解决方案,甚至迁移到eclipselink 2.6.4。我删除了persistence.xml中涉及的2个类,将其保存并再次添加。错误仍然存​​在。

然后,我删除了persistence.xml中包含的实体类列表中的所有类,然后再次将它们包括在内。

现在可以了。神奇地。

但是,历史上确实没有区别。甚至是单个字符。


WeM*_*are 1

从 Mandator 类的 @OneToMany 注释中删除mappedBy

检查所有相关类是否都映射为@Entity。Department 类与 DocumentUser 具有 @ManyToMany 关系。提供 DocumentUser 类的列表