5

有人可以给我一个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 类型。有人能帮帮我吗 ?如果我不能得到一个确切的解决方案,可以做一些接近的事情,但我会很感激任何回应。

4

5 回答 5

5

我在实现几个@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;
    }
}
于 2008-11-24T16:24:06.917 回答
2

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

于 2008-11-24T16:24:33.437 回答
1

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

@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 映射问题并解决了更糟糕的解决方案,但这次我决定我要弄清楚,所以我一直在破解它。再次感谢两位的回答,非常感谢。

于 2008-11-24T17:52:51.480 回答
1

只是为了将来的观点更新这个问题。

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

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

于 2017-08-31T13:09:34.060 回答
-2

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

你最好使用多对一映射。

于 2009-06-17T08:12:00.190 回答