2008-11-24 110 views
4

有人請給我一個在Hibernate中單向@OneToOne主鍵映射的例子嗎?我嘗試過多種組合,到目前爲止,我已經得到的最好的事情是這樣的:需要一個主鍵@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 ,而不是一長,這是PaperCheque的id類型。有人能幫幫我嗎 ?如果我不能得到一個確切的解決方案,接近的事情會做,但我會很感激任何迴應。

回答

1

你的目的是使PaperChequeStopMetaData和PaperCheque之間的關係1-1?如果是這樣,您不能將PaperCheque實例定義爲PaperChequeStopMetaData的@Id,您必須在PaperChequeStopMetaData中定義一個單獨的@Id列。

3

我保存了this discussion當我實現了一對@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; 
    } 
} 
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映射問題,並且解決了更糟糕的解決方案,但是這次我決定要弄清楚,所以我一直在不停地攻擊它。再次感謝您的答覆,非常感謝。