繁体   English   中英

ValidationException异常描述:在关系属性中使用非实体作为目标实体

[英]ValidationException Exception Description: uses a non-entity as target entity in the relationship attribute

我收到以下异常并且之前完成了所有这1000次,但现在我收到错误:

ValidationException异常描述:[class com.smartphonedev.rsvplaw.entities.Staff]使用非实体[class com.smartphonedev.rsvplaw.entities.Address]作为关系属性[field addresses]中的目标实体。

这是有问题的实体。 有人能帮助我找出我的人际关系有什么问题吗?

<code>
@Entity
@Table(name="address")
public class Address implements Serializable,
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name="addressType")
@Enumerated(EnumType.ORDINAL)
private AddressType addressType;

@Column(name="streetLineOne")
private String streetLineOne;

@Column(name="streetLineTwo")
private String streetLineTwo;

@Column(name="city")
private String city;

@Column(name="adState")
private String state;

@Column(name="postCode")
private String postCode;    

@OneToMany(fetch=FetchType.LAZY, targetEntity=PhoneNumber.class, cascade = {CascadeType.MERGE,   CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true)
@JoinColumn(name="phoneNumbers")
private Collection<PhoneNumber> phoneNumbers;
…..
}

@Entity
@Table(name="staff")
public class Staff implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

//private Profile profile;
@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
@JoinColumn(name="permission")
private Permission permission;

@OneToOne(fetch=FetchType.LAZY,cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
@JoinColumn(name="login")    
private Login login;

@Column(name="firstName")
private String firstName;

@Column(name="surnameName")
private String surnameName;

@Column(name="emailAddress")
private String emailAddress;

@OneToMany(fetch=FetchType.LAZY, targetEntity=PhoneNumber.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true)
@JoinColumn(name="phoneNumbers")
private Collection<PhoneNumber> phoneNumbers;

@OneToMany(fetch=FetchType.LAZY, targetEntity=Address.class, cascade = {CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH},orphanRemoval=true)
@JoinColumn(name="addresses")
private Collection<Address> addresses;
}
</code

添加phoneNumber类@Entity @Table(name="phone") public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Entity @Table(name="phone") public class PhoneNumber implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;

 @Column(name="numberType") @Enumerated(EnumType.ORDINAL) private PhoneNumberType numberType; @Column(name="phoneNumber") private String phoneNumber; } </code> Adding persistance.xml 

@Column(name="numberType") @Enumerated(EnumType.ORDINAL) private PhoneNumberType numberType; @Column(name="phoneNumber") private String phoneNumber; } </code> Adding persistance.xml

 <code> <?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="RSVPLawServerPU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/RSVPLaw</jta-data-source> <class>com.smartphonedev.rsvplaw.entities.PhoneNumber</class> <class>com.smartphonedev.rsvplaw.entities.Address</class> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>NONE</shared-cache-mode> <validation-mode>CALLBACK</validation-mode> <properties> <property name="eclipselink.target-server" value="SunAS9"/> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> <property name="eclipselink.ddl-generation" value="create-tables"/> <property name="eclipselink.ddl-generation.output-mode" value="database"/> <property name="javax.persistence.schema-generation.database.action" value="create"/> </properties> </persistence-unit> </persistence> <code> 

在将@ManyToMany关系分成两个@OneToMany/@ManyToOne关系时,我处于同样的情况,我解决了它。 以下是从上述所有答案中得出的一些提示,以及我的发现:

  1. 确保该类具有注释@Entity ,并具有正确的Table(name=xxx)
  2. 如果使用JPA,请确保它在persistence.xml 如果使用Hibernate,请确保它位于hibernate.cfg.xml 如果在两个文件中同时使用两者。
  3. 确保这些类与mapping / cfg文件位于同一个JAR中。
  4. 我找到的一件事是: 您不必删除mappedBy= ,但您必须确保属性名称在整个项目中是唯一的!

就像在我的情况下:如果我在@OneToMany方面删除mappedBy (而@ManyToOne方是@ManyToMany关系的中间类,它有自己的字段,所以我必须使它成为@Entity而不是直接使用中间表) ,EclipseLink抱怨名为“EntityA_MiddleEntity”的表,该表不存在。 我想,当遇到mappedBy=xxx ,EclipseLink会查找名为xxx字段的所有实体,当它存在于多个类中时,其中一个类是@ManyToMany的中间类,它无法关联它们。 所以我改变了中产阶级的属性名称,一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM