繁体   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