【问题标题】:Hibernate annotation OnetoOne relationshipHibernate注解OnetoOne关系
【发布时间】:2012-06-03 13:07:12
【问题描述】:

我有一个严重的问题。我有一张桌子

门票信息

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的数据类型必须保持为字符串。我可以添加额外的逻辑但不能改变现有的流程。

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

【问题讨论】:

  • 所以没有TICKETINFO.REMARK这样的列?你不能在 Ticketinfo 类上将它映射为@Column。通常,您会有一个单独的实体类 TicketinfoRemark,它将通过 @OneToOne 注释链接到 Ticketinfo。您可能可以在 Ticketinfo 中添加一个访问器:String getRemark() { if (ticketinfoRemark != null) return ticketinfoRemark.remark; },但这是一个 hack。
  • Create and populate child table from Parent table using Hibernate Annotation 的可能重复项如何阅读您第一次发布此问题时得到的答案?

标签: java hibernate annotations


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    希望对你有帮助。

    【讨论】:

    • 嗯...我是 Hibernate 的新手...所以你能帮我写一下这个类吗....就像在 Ticketinfo.java 中 OnetoOne 语法的样子
    • 用示例更新了帖子,如果它不起作用,请抱歉,我现在无法测试它。
    • Alexey,您必须检查访问ticketInfoRemark 字段的null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2012-07-13
    • 2020-08-05
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多