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

Posted

技术标签:

【中文标题】ValidationException 异常描述:在关系属性中使用非实体作为目标实体【英文标题】:ValidationException Exception Description: uses a non-entity as target entity in the relationship attribute 【发布时间】:2015-01-14 07:11:26 【问题描述】:

我遇到了以下异常,之前已经完成了 1000 次,但现在我遇到了错误:

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

这里是有问题的实体。有人可以帮我找出我的人际关系出了什么问题吗?

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

@Column(name="numberType")
@Enumerated(EnumType.ORDINAL)
private PhoneNumberType numberType;

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

</code>

添加persistance.xml


org.eclipse.persistence.jpa.PersistenceProviderjdbc/RSVPLawcom.smartphonedev.rsvplaw.entities.PhoneNumbercom.smartphonedev.rsvplaw.entities.Addressfalse回调属性>
持久性>


【问题讨论】:

@OneToMany 应该是mappedBy,而@ManyToOne 后面应该是@JoinColumn @guido OneToMany 只有在它是双向的情况下才具有“mappedBy”......那么当他没有显示 PhoneNumber 类时,你怎么知道在这种情况下呢? ***.com/questions/11938253/jpa-joincolumn-vs-mappedby 请注意它们都是单向的 您的班级Address 是否列在persistence.xml 中?看起来它不是“已知”的实体。 【参考方案1】:

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

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

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

【讨论】:

以上是关于ValidationException 异常描述:在关系属性中使用非实体作为目标实体的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 抛出一个自定义的 ValidationException

Laravel 5.8 Illuminate\Validation\ValidationException:给定的数据无效

DynamoDB 简单 UpdateItem 抛出“提供的关键元素与架构不匹配”ValidationException

如何避免 Hibernate ValidationException 上的自动实体更新

返回带有错误的响应,而不是在验证管道 mediatr 3 中抛出异常

javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation p