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

jpa错误使用非实体[class ch.printsoft.mailhouse.usermgr.entity.Department]作为关系属性中的目标实体,jpa,persistence,eclipselink,Jpa,Persistence,Eclipselink,我试图将我的部门和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 dep

我试图将我的
部门
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;
@实体
公共类命令{
@身份证
@生成值
私有整数id;
私人字符串强制;
@OneToMany(mappedBy=“mandator”)
私人名单义务者;
@OneToMany(mappedBy=“mandator”)
私人名单家庭成员;
@OneToMany(mappedBy=“mandator”)
私人名单组;
@OneToMany(mappedBy=“mandator”)
私人名单部门;
@OneToMany(mappedBy=“mandator”)
私人单位名单;
@实体
公共课系{
@身份证
@生成值
私有整数id;
私有字符串名称;
私人串负责人;
私有字符串位置;
@多通(可选=假)
私人委托人;
@许多
私人用户名单;

我真的尝试了每一件事,但都没有成功。

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


检查是否所有相关类都映射为@Entity。Department类与DocumentUser有@ManyToMany关系。提供DocumentUser类的列表确保在persistence.xml中列出了这两个类,并且这两个类都在类路径上

请包含persistence.xml。

确保两个“类”文件位于同一个jar中。
确保没有两个同名的.class文件!

确保两个类都具有PK属性和无参数构造函数。 我在实体类中添加以下代码

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

检查您的
mappedBy=xxx
,确保
xxx
在整个项目中是唯一的。

我刚刚花了很多时间调试了一个似乎无法解释的异常情况,所以我就把我的故事留在这里

如果您使用的是JPA的一个比较旧的实现(例如EclipseLink 2.5.x),并且您在代码库中使用的是现代Java 8功能(例如lambda表达式),请不要在JPA实体类中使用它们

EclipseLink 2.5的类元数据解析器在遇到Java8特性(如lambda表达式、方法引用等)时崩溃在字节码中。内部崩溃是一个非常不友好的
ArrayIndexOutOfBoundsException
,但您甚至看不到它,因为weaver代码默默地忽略元数据解析器崩溃,只是假设类没有感兴趣的元数据。这使它相信所讨论的类不是一个实体,即使它拥有所有的元数据正确的注释,最终结果就是我们正在讨论的错误消息


一句话:不要在JPA实体类中使用java8lambda。永远不要。

我希望这能帮助一些人

我也有同样的问题。 前一天晚上,一切都很好。 在NetBeans中,我使用历史记录检查了错误涉及的所有文件。 包括Persistence.xml。 没有任何改变

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

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

现在它起作用了。 神奇地

但事实上,历史上没有什么不同。
即使只有一个字符。

请确保在标记所使用的persistence.xml标记中定义了这两个类。在持久化时,实体到DB应用程序将从persistence.xml文件中查找实体信息。如果未找到映射实体,应用程序将抛出此异常

请包括persistence.xml

例如: persistence.xml:-

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">   
    <persistence-unit name="mapping_unit">
        <class>ch.printsoft.mailhouse.usermgr.entity.Mandator </class>
        <class>ch.printsoft.mailhouse.usermgr.entity.Department</class>
        ...
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/practice" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
            <property name="eclipselink.logging.level" value="SEVERE" />
            <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
        </properties>
    </persistence-unit>
    
</persistence>

ch.printsoft.mailhouse.usermgr.entity.Mandator
ch.printsoft.mailhouse.usermgr.entity.Department
...

异常描述:[class ch.printsoft.mailhouse.usermgr.entity.Mandator]使用非实体[class ch.printsoft.mailhouse.usermgr.entity.Department]作为关系属性[field departments]中的目标实体。从Department类中删除“optional=false”从mandatorc上的@ManyToOne注释可以用修改后的注释更新问题中的类列表并提供完整的类列表吗?从例外情况来看,实体管理器似乎“思考”没有实体部门。顺便说一句,你有没有将DocumentUser映射为一个实体?测试并遇到了完全相同的问题!Thx的底线解决了这个问题:-/但是EclipseLink 2.6.4已经解决了这个问题,现在JPA在lambdas上运行得很好!!至少我测试过的东西;-)谢谢kFYatek!在我的情况下,一个实体被你忽略了t来自JPA的任何警告(在精细日志中!!),然后在指向此被忽略实体的@OneToMany上,JPA抛出异常“实体a使用非实体B(被忽略的实体)…如何在乌云中损失1个小时……:p在我的实体B中丢失了一个小lambda表达式:)替换后,一切正常!遇到了相同的问题-谢谢你的回答。向上投票。谢谢!如果有办法增加20票,我会的。在这个错误上损失了2个小时…谢谢。我移动了东西,忘了检查我的持久性更新了ce.xml。请检查它,即使您认为它是正确的!:-)这今天为我节省了很多时间。谢谢:)