有人可以请给我一个例子一个单向@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;
}

只要休眠试图自动地产生的架构,上述的映射,它试图创建的主要关键作为一个blob,而不是作为一个长期的,这是身份证种类型的PaperCheque.有人能帮帮我吗?如果我不能获得一个确切的解决方案,近东西会做,但我会很感激的任何响应。

有帮助吗?

解决方案

您意图是具有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问题,并为解决更糟糕的解决方案,但这次我决定我要弄清楚了,所以我一直黑客不停。再次感谢你们对你的答案,它是大加赞赏。

只是更新这个问题对于未来的意见。

当这个问题是我认为没有一个适当的解决这个问题。但由于访问用户2.0可以使用@MapsId来解决这个问题。

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

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

正在关闭使用多对一映射更好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top