2

我有一个关键问题。我有一张桌子

票务信息

TICKETINFOID pk, REMARK 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 表的外键,并且必须填充 TICKETINFO_REMARK 的 REMARK 字段以及相应 TICKETINFOID 的 TICKETINFO 的 REMARK 字段。

对于 1 TICKETINFOID,将有一个 REMARK,它可以为空。 Ticketinfo.java 中 REMARK 的数据类型必须保持为字符串。我可以添加额外的逻辑但不能更改现有流程。

请帮助我,因为我陷入了可怕的混乱......

4

2 回答 2

0

听起来一对一可以解决子表的链接问题。对于评论本身,您可能想要劫持访问器和修改器,因为我认为 Hibernate 无法处理您想要的开箱即用的东西。如果您将某些东西作为另一个表的属性,那么以这种方式伪造它不是正交或最佳实践。如果您无法更改它,请保持原样,除非您有充分的理由在代码中编写奇怪的软糖。

于 2012-05-29T10:10:11.333 回答
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
}

希望能帮助到你。

于 2012-05-29T10:16:19.210 回答