【问题标题】:How to do One to One association in hibernate with foreign key and join table and unidirectional如何在休眠中使用外键和连接表和单向进行一对一关联
【发布时间】:2018-05-17 17:18:25
【问题描述】:

我希望以单向方式与连接表建立一对一的关联。 -

表格:

  1. A(A_id、D_id、A_Data)
  2. B (A_id, C_id) // 连接表只包含 A 和 C 之间的关系
  3. C (C_id, C_Data)

    Class A {
       .
       .
    @OneToOne(cascade = CascadeType.ALL)
    @JoinTable(name = "B",
            joinColumns = @JoinColumn(name = "A_id", referencedColumnName = "A_id"), 
            inverseJoinColumns = @JoinColumn(name = "C_id", referencedColumnName = "C_id"))
    private C c;
    }
    

我在 jpa 2.0 中使用休眠。 实体 D 在模型中并不重要,因此被忽略。 我只想读取数据,因此不应该担心插入/更新/删除用例,但在这种情况下也可以建议最佳实践。

此设置不起作用。有人可以建议如何以正确的方式做到这一点吗?

它给出了以下异常

org.hibernate.MappingException: Unable to find column with logical name: A_id in org.hibernate.mapping.Table(A) and its related supertables and secondary tables

【问题讨论】:

  • 您能详细说明什么不适合您吗?任何错误消息都会有所帮助。
  • 为什么需要这种关系?如果你想一对一在 A 或 C 中添加一个带有 @OneToOne 的额外字段
  • 数据库存在很久了,我不想改变架构。
  • @JoinTable(name = "B", joinColumns = @JoinColumn(name = "A_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "C_id", referencedColumnName = "id") 在引用列名时,它应该与实体中存在的字段相关
  • 看起来不是真的。 referencedColumnName 的值应始终是列名。

标签: java hibernate jpa hibernate-mapping


【解决方案1】:

为了得到你想要的架构:

    // Given the following C entity
    @Entity
    public class C {

        @Id
        @Column(name = "C_ID")
        private long id;

        private String C_Data;

        //...
    }


    // A Entity should be 
    @Entity
    public class A {

        @Id
        @Column(name = "A_ID")
        private long id;

        private String A_Data;

        @OneToOne(cascade = CascadeType.ALL )
        @JoinTable(name = "B", joinColumns = @JoinColumn(name = "A_id"), inverseJoinColumns = @JoinColumn(name = "C_id", unique = true))
        private C c;

        //...

    }

我省略了referencedColumnName,所以hibernate会将它映射到实体主键。

还要注意B 表的A_id 列将是主键。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多