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

时间:2011-12-02 08:44:59

标签: jpa persistence 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)

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

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

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

9 个答案:

答案 0 :(得分:41)

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

请包含您的persistence.xml。

答案 1 :(得分:38)

我花了很多时间调试一个看似无法解释的例外情况,所以我只是把我的故事留在这里。

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

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

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

答案 2 :(得分:3)

我希望这可以帮助别人。

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

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

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

现在它有效。 神奇。

但实际上历史上没有什么不同。 甚至是一个角色。

答案 3 :(得分:1)

从Mandator类

中的@OneToMany注释中删除mappedBy

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

答案 4 :(得分:1)

确保在正在使用的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>

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

class Matriline(db.Model):
    __tablename__ = 'matriline'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    calls = db.relationship('Call', backref='matriline', lazy='select')
    pod_id = db.Column(db.Integer, db.ForeignKey('pod.id'))

    def __unicode__(self):
        return self.name

    def __str__(self):
        return self.name


class Pod(db.Model):
    __tablename__ = 'pod'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    matrilines = db.relationship('Matriline', backref='pod', lazy='select')
    clan_id = db.Column(db.Integer, db.ForeignKey('clan.id'))

    def __unicode__(self):
        return self.name
    def __str__(self):
        return self.name


class Clan(db.Model):
    __tablename__ = 'clan'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    pods = db.relationship('Pod', backref='clan', lazy='select')

    def __unicode__(self):
        return self.name

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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 中的 entery 都应该存在。