【发布时间】:2017-09-11 16:03:00
【问题描述】:
当两个类中的复合主键相同时,我无法成功使用@OneToOne:
@Entity
public class One implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private OnePK onePK;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "one")
private Two two;
//... constructors, getters and setters
}
@Entity
public class Two implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private TwoPK twoPK;
@JoinColumns({
@JoinColumn(name = "P_ID", referencedColumnName = "P_ID", insertable = false, updatable = false),
@JoinColumn(name = "L_ID", referencedColumnName = "L_ID", insertable = false, updatable = false)})
@OneToOne(optional = false)
private One one;
//... constructors, getters and setters
}
@Embeddable
public class OnePK implements Serializable {
@Basic(optional = false)
@Column(name = "P_ID")
private BigInteger dId;
@Basic(optional = false)
@Column(name = "L_ID")
private BigInteger lId;
//... constructors, getters and setters
}
@Embeddable
public class TwoPK implements Serializable {
@Basic(optional = false)
@Column(name = "P_ID")
private BigInteger dId;
@Basic(optional = false)
@Column(name = "L_ID")
private BigInteger lId;
//... constructors, getters and setters
}
当我按原样使用上面的源代码时,我得到:
12:56:04,021 警告 [org.apache.cxf.phase.PhaseInterceptorChain] (默认任务 83)应用程序 {http://services.webservices.*****.******.com/}ObjectManagerService#{http://services.webservices.*****.******.com/}getAllObjects 已经抛出异常,现在展开:org.apache.cxf.interceptor.Fault: java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException:为 com.******.*****..**********.两个。预期:类 com.******.*****..********.TwoPK,上课了 com.******.*****.**.********.OnePK at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162) 在 org.apache.cxf.jaxws.AbstractJAXWSMethodInvoker.createFault(AbstractJAXWSMethodInvoker.java:267) 在
当我使用同一个类 (OnePK) 作为两个类(一和二)的主键时,我得到:
11:44:35,735 警告 [org.apache.cxf.phase.PhaseInterceptorChain] (默认任务 83)拦截器 {http://services.webservices.*****.******.com/}ObjectManagerService#{http://services.webservices.*****.******.com/}getAllObjects 已经抛出异常,现在展开:org.apache.cxf.interceptor.Fault: 编组错误:在对象图中检测到循环。这将 导致无限深的 XML : One[ onePK=OnePK[ dId=3151, lId=426 ] ] -> 二[ twoPK=OnePK[ dId=3151, lId=426 ] ] -> 一[ onePK=OnePK[ dId=3151, lId=426]]在 org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:266) 在 org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:238) 在 org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:118) 在
使用@PrimaryKeyJoinColumns 没有帮助,我使用了this answer 和this tutorial,我得到了相同的错误消息。使用 @MapsId 没有帮助,我得到“org.hibernate.exception.GenericJDBCException:无法准备语句”。也许根本原因是this unfixed bug of Hibernate。我发现的唯一解决方法是删除第一次出现的@OneToOne 和类“One”中的字段“two”,但是当我删除此实例时,One 实例包含的 Two 实例不再被删除一,这就是我使用 CascadeType.ALL 的原因。
这个 JPA 源代码是由 Netbeans 8 自动生成的。我有点没办法了。有没有办法让它正常工作?这真的是Hibernate的限制吗?是否有另一种 JPA 实现正确处理这种情况?
【问题讨论】:
标签: java hibernate jakarta-ee jpa-2.0 type-mismatch