需要一个Hibernate中主键@OneToOne映射的示例

有人可以给我一个Hibernate中单向@OneToOne主键映射的例子吗? 我尝试了很多组合,到目前为止,我得到的最好的事情是:

@Entity @Table(name = "paper_cheque_stop_metadata") @org.hibernate.annotations.Entity(mutable = false) public class PaperChequeStopMetadata implements Serializable, SecurityEventAware { private static final long serialVersionUID = 1L; @Id @JoinColumn(name = "paper_cheque_id") @OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class) private PaperCheque paperCheque; } 

每当Hibernate尝试自动生成上述映射的模式时,它会尝试将主键创建为blob,而不是long,即PaperCheque的id类型。 有人能帮帮我吗 ? 如果我无法得到一个确切的解决方案,那么接近就会有所作为,但我会感激任何回应。

您打算在PaperChequeStopMetaData和PaperCheque之间建立1-1的关系? 如果是这样,你不能将PaperCheque实例定义为PaperChequeStopMetaData的@Id,你必须在PaperChequeStopMetaData中定义一个单独的@Id列。

当我实现了几个@OneToOne映射时,我保存了这个讨论 ,我希望它对你也有用,但是我们不让Hibernate为我们创建数据库。

请注意GenericGenerator注释。

无论如何,我有这个代码工作:

 @Entity @Table(name = "message") public class Message implements java.io.Serializable { @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @PrimaryKeyJoinColumn(name = "id", referencedColumnName = "message_id") public MessageContent getMessageContent() { return messageContent; } } @Entity @Table(name = "message_content") @GenericGenerator(name = "MessageContent", strategy = "foreign", parameters = { @org.hibernate.annotations.Parameter ( name = "property", value = "message" ) } ) public class MessageContent implements java.io.Serializable { @Id @Column(name = "message_id", unique = true, nullable = false) // See http://forum.hibernate.org/viewtopic.php?p=2381079 @GeneratedValue(generator = "MessageContent") public Integer getMessageId() { return this.messageId; } } 

谢谢你们的回答。 我一直在试验,这就是我的工作:

 @Entity @Table(name = "paper_cheque_stop_metadata") @org.hibernate.annotations.Entity(mutable = false) public class PaperChequeStopMetadata implements Serializable, SecurityEventAware { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") @Id @Column(name = "paper_cheque_id") @AccessType("property") private long id; @OneToOne(cascade = {}, fetch = FetchType.EAGER, optional = false, targetEntity = PaperCheque.class) @PrimaryKeyJoinColumn(name = "paper_cheque_id") @JoinColumn(name = "paper_cheque_id", insertable = true) @NotNull private PaperCheque paperCheque; @XmlAttribute(namespace = XMLNS, name = "paper-cheque-id", required = true) public final long getId() { return this.paperCheque.getId(); } public final void setId(long id) { //this.id = id; //NOOP, this is essentially a pseudo-property } } 

无论如何,这是一个恶心的黑客,但它让我得到了我想要的一切。 paperCheque属性访问器正常(未显示)。 我之前遇到过这种单向OneToOne映射问题并为更糟糕的解决方案解决了问题,但这次我决定要弄明白,所以我一直在抨击它。 再次感谢您的回答,非常感谢。

你应该远离hibernate的OneToOne映射,这是非常危险的。 见http://opensource.atlassian.com/projects/hibernate/browse/HHH-2128

你最好使用ManyToOne映射。

只是更新此问题以供将来查看。

当提出这个问题时,我认为没有适当的解决方案来解决这个问题。 但是从JPA 2.0开始,您可以使用@MapsId来解决这个问题。

参考正确解释: https : //vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/