2012-05-29 127 views
2

我有一個嚴重問題。我有一個表Hibernate註釋OnetoOne關係

TICKETINFO

TICKETINFOID PK,備註爲varchar(128),TICKETDATE時間戳

它與休眠註釋這在一定程度看起來像這樣

@Entity 
@Table(name = "TICKETINFO") 
public class Ticketinfo implements Serializable { 

    @Id 
    @Column(name = "TICKETINFOID") 
    private Long id; 
    @Column(name = "TICKETDATE") 
    private String date; 
    @column(name = "REMARK") 
    private string remark; 

    //getters and setters 
} 
現在我

對應的類工作是我需要創建TICKETINFO表兒童表

TICKETINFO_REMARK

PK TICKETINFO_REMARK_ID,TICKETINFOID FK,REMARK VARCHAR(128)

和TICKETINFOID將從TICKETINFO表的外鍵和有填充TICKETINFO_REMARK的REMARK場與TICKETINFO的用於相應的TICKETINFOID REMARK字段一起。

對於1 TICKETINFOID將會有一個備註,它可能爲空。 Ticketinfo.java中REMARK的數據類型必須將其保留爲string.I可以添加額外的邏輯,但不能更改現有的流。

請幫助我,因爲我在一個可怕的混亂....

+0

那麼沒有TICKETINFO.REMARK這樣的列?您不能將它映射爲Ticketinfo類中的「@ Column」。通常情況下,您會有一個單獨的實體類TicketinfoRemark,它將通過'@ OneToOne'註釋鏈接到Ticketinfo。您可以在Ticketinfo中添加一個訪問器:'String getRemark(){if(ticketinfoRemark!= null)return ticketinfoRemark.remark; }'但這是一個黑客。 – maksimov

+0

可能重複[使用Hibernate Annotation從父表創建和填充子表](http://stackoverflow.com/questions/10784891/create-and-populate-child-table-from-parent-table-using-hibernate-註釋)如果你第一次發佈這個問題,閱讀你的答案如何? –

回答

0

這聽起來像一到,人們會爲銜接子表做的伎倆。對於這個評論本身,你可能會想要劫持訪問器和增變器,因爲我認爲Hibernate並沒有處理你想要的東西。如果你有某種東西作爲另一張桌子的屬性,用這種方式僞造它並不是正交或最佳實踐。如果你不能改變它,保持原樣,除非你有很好的理由在你的代碼中寫入奇怪的瑕疵。

0

您可以將REMARK字段設置爲@Transient,並使用@PreUpdate @PrePersist和@PostLoad方法從/向一對一映射的TICKETINFO_REMARK實體加載和保存標記字段。在TICKETINFO_REMARK一側也可以做同樣的事情。

這裏是快速的例子,它沒有測試,只是給你一個想法。

@Entity 
@Table(name = "TICKETINFO") 
public class Ticketinfo implements Serializable { 

    @Id 
    @Column(name = "TICKETINFOID") 
    private Long id; 
    @Column(name = "TICKETDATE") 
    private String date; 
    @Transient 
    private string remark; 
    @OneToOne 
    @PrimaryKeyJoinColumn 
    private TicketinfoRemark ticketInfoRemark; 

    @PostLoad 
    public void postLoad() { 
     if (ticketInfoRemark != null) 
      this.remark = ticketInfoRemark.getRemark(); 
    } 

    @PreUpdate 
    @PrePersist 
    public void prePersist() { 
     if (ticketInfoRemark != null) 
      ticketInfoRemark.setRemark(this.remark); 
    } 
    //getters and setters 
} 

希望它能幫助。

+0

嗯......我是Hibernate的新手......所以你可以爲我寫類......比如OnetoOne語法在Ticketinfo.java中的樣子將如何變化 – saptarshi

+0

更新後的例子,請對不起不起作用,我現在無法測試它。 –

+0

Alexey,您必須檢查'null',您在哪裏訪問ticketInfoRemark字段。 – maksimov