【问题标题】:jpa error uses a non-entity [class ch.printsoft.mailhouse.usermgr.entity.Department] as target entity in the relationship attributejpa 错误使用非实体 [class ch.printsoft.mailhouse.usermgr.entity.Department] 作为关系属性中的目标实体
【发布时间】:2012-01-11 07:55:43
【问题描述】:

我尝试将我的 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)

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

@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;

我真的尝试了所有方法,但没有成功。

【问题讨论】:

    标签: jpa persistence eclipselink


    【解决方案1】:

    真是一场噩梦。对我来说,当我从“文件”菜单中使 IntelliJ Idea 的缓存失效时,它就起作用了

    【讨论】:

      【解决方案2】:

      1))正确的父母和孩子的关系。

      头等舱

      @Entity
      @Table(name="nova_payment_result")
      @NamedQuery(name="NovaPaymentResult.findAll", query="SELECT n FROM NovaPaymentResult n")
      @JsonIgnoreProperties({"novaOrder"})
      public class NovaPaymentResult implements Serializable {
          private static final long serialVersionUID = 1L;
       
          //bi-directional many-to-one association to NovaOrder
          @JsonIgnoreProperties("paymentResults")
          @ManyToOne(fetch = FetchType.LAZY)
          @JoinColumn(name="orderid")
          private NovaOrder novaOrder;
      

      二等

      @Entity
      @Table(name="nova_order")
      @NamedQueries({
      @NamedQuery(name="NovaOrder.findAll", query="SELECT n FROM NovaOrder n")
      })
      @JsonIgnoreProperties({"novaOrders","novaCustomerProfile"})
      public class NovaOrder implements Serializable {
          private static final long serialVersionUID = 1L;
      @OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL,mappedBy="novaOrder")
          private List<NovaPaymentResult> paymentResults;
      

      确保persistence.xml 中的输入对于两个类都应该存在。

      【讨论】:

        【解决方案3】:

        确保您在标签使用的 persistence.xml 的标签中定义了这两个类。在持久化时,数据库应用程序中的实体会从 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>
        

        【讨论】:

          【解决方案4】:

          我希望这可以帮助某人。

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

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

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

          现在可以了。 神奇。

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

          【讨论】:

            【解决方案5】:

            我刚刚花了很多时间调试这个异常的一个看似无法解释的案例,所以我就在这里留下我的故事。

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

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

            底线:不要在 JPA 实体类中使用 Java 8 lambda。 永远。

            【讨论】:

            • 经过测试并遇到完全相同的问题!感谢修复问题的底线:-/
            • 但是 EclipseLink 2.6.4 已经解决了这个问题,现在 JPA 可以很好地与 lambdas 配合使用!至少我测试过的东西;-)
            • 感谢 kFYatek !在我的情况下,一个实体被忽略了,没有来自 JPA 的任何警告(在 FINE 日志中!!),然后在 @OneToMany 指向这个被忽略的实体时,JPA 抛出一个异常“实体 A 使用非实体 B(被忽略的实体) ... 如何在乌云中损失 1 小时 .... :pa 小 lambda 表达式在我的实体 B 中丢失了 :) 替换后,一切正常!
            • 刚刚遇到同样的问题 - 感谢您的回答。点赞。
            • 谢谢!如果有办法增加 20 票,我会的。刚刚在这个错误上浪费了 2 个小时...
            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  请包含您的 persistence.xml。

                  【讨论】:

                  • 谢谢。我移动了一些东西,忘记检查我的 persistence.xml 是否已更新。检查它,即使你认为它是正确的! :-)
                  • 今天这为我节省了很多时间。谢谢:)
                  【解决方案10】:

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

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

                  【讨论】:

                  • 异常描述:[class ch.printsoft.mailhouse.usermgr.entity.Mandator] 使用非实体 [class ch.printsoft.mailhouse.usermgr.entity.Department] 作为关系中的目标实体属性[外勤部门]。
                  • 从Department类中删除“optional = false” from @ManyToOne annotation on mandator
                  • 您能否使用修改后的注释更新问题中的课程列表并提供完整的课程列表?从例外看来,实体经理“认为”没有实体部门。
                  • 顺便说一句,您是否将 DocumentUser 映射为实体?
                  猜你喜欢
                  • 2015-06-07
                  • 2017-05-22
                  • 1970-01-01
                  • 2015-02-09
                  • 1970-01-01
                  • 2015-01-14
                  • 2023-03-31
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多