簡體   English   中英

Hibernate注釋OnetoOne關系

[英]Hibernate annotation OnetoOne relationship

我有一個關鍵問題。 我有桌子

票務信息

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

TICKETINFO_REMARK_ID pk,TICKETINFOID fk,REMARK varchar(128)

TICKETINFOID是TICKETINFO表中的外鍵,並且必須為相應的TICKETINFOID填充TICKETINFO_REMARK的REMARK字段以及TICKETINFO的REMARK字段。

對於1個TICKETINFOID,將有一個REMARK,並且它可以為null。 Ticketinfo.java中REMARK的數據類型必須保留為字符串。我可以添加額外的邏輯,但不能更改現有流程。

請幫助我,因為我陷入了嚴重的混亂。

聽起來一對一會完成子表的鏈接。 對於備注本身,您可能要劫持訪問器和更改器,因為我認為Hibernate不會開箱即用地處理您想要的東西。 如果您將某些內容作為另一個表的屬性,則以這種方式進行偽造不是正交或最佳實踐。 如果您不能更改它,請保持原樣,除非您有非常充分的理由將奇怪的軟糖寫入代碼中。

您可以將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
}

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM