我有一个关键问题。我有一张桌子
TICKETINFOID pk,REMARK varchar(128),TICKETDATE时间戳
它有一个带有hibernate注释的相应类,有点看起来像这样
@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_ID pk,TICKETINFOID fk,REMARK varchar(128)
和TICKETINFOID将是来自TICKETINFO表的外键,并且必须填写TICKETINFO_REMARK的REMARK字段以及相应的TICKETINFOID的TICKETINFO的REMARK字段。
对于1 TICKETINFOID,将有一个REMARK,它可以为null。 Ticketinfo.java中REMARK的数据类型必须将其保留为字符串。我可以添加额外的逻辑,但不能更改现有流量。
请帮助我,因为我在一个可怕的混乱中......
答案 0 :(得分:0)
这听起来像一对一会做到连接子表的技巧。对于注释本身,你可能想要劫持访问器和更改器,因为我认为Hibernate不会处理你想要的东西。如果您将某些内容作为另一个表的属性,则以这种方式伪造它不是正交或最佳实践。如果您无法更改它,请保持原样,除非您有非常充分的理由在您的代码中写入奇怪的软糖。
答案 1 :(得分: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
}
希望它有所帮助。