Hibernate注释OnetoOne关系

时间:2012-05-29 10:03:31

标签: java hibernate annotations

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

TICKETINFO

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

TICKETINFO_REMARK_ID pk,TICKETINFOID fk,REMARK varchar(128)

和TICKETINFOID将是来自TICKETINFO表的外键,并且必须填写TICKETINFO_REMARK的REMARK字段以及相应的TICKETINFOID的TICKETINFO的REMARK字段。

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

请帮助我,因为我在一个可怕的混乱中......

2 个答案:

答案 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
}

希望它有所帮助。