Java 需要Hibernate中主键@OneToOne映射的示例吗

Java 需要Hibernate中主键@OneToOne映射的示例吗,java,hibernate,annotations,one-to-one,Java,Hibernate,Annotations,One To One,有人能给我举一个Hibernate中单向@OneToOne主键映射的例子吗?我尝试了很多组合,到目前为止,我得到的最好的结果是: @Entity @Table(name = "paper_cheque_stop_metadata") @org.hibernate.annotations.Entity(mutable = false) public class PaperChequeStopMetadata implements Serializable, SecurityEventAware {

有人能给我举一个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(PaperCheck的id类型)。谁能帮帮我吗?如果我不能得到一个精确的解决方案,可以用close,但我希望得到任何回应。

我在实现了几个@OneTONE映射时保存了它,我希望它也能对您有用,但我们不会让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;
    }
}

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

谢谢你们的回答。我一直在试验,以下是我得到的结果:

@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
}
}

这绝对是一个令人厌恶的黑客行为,但它让我得到了我想要的一切。PaperCheck属性访问器正常(未显示)。我以前遇到过这种单向的OneToOne映射问题,并解决了更糟糕的解决方案,但这次我决定要找出答案,所以我一直在尝试。再次感谢你们的回答,非常感谢。

你们应该远离hibernate的OneToOne映射,它非常危险。看


您最好使用多通映射。

只需更新此问题以备将来查看

当提出这个问题时,我认为这个问题没有一个合适的解决方案。但是由于JPA2.0,您可以使用@MapsId来解决这个问题


参考和正确解释:

链接已断开。此外,只发布链接答案而不发布解释也是不好的做法。q、 根据文件,这种方法是最有效的方法。谢谢分享。