【问题标题】:How to map two tables to one entity using foreign-key?如何使用外键将两个表映射到一个实体?
【发布时间】:2012-05-12 04:27:05
【问题描述】:

我有一个与此非常相似的问题:How do I join tables on non-primary key columns in secondary tables? 但我不确定我是否可以应用相同的解决方案。

我有两张这样的表:

CREATE TABLE CUSTOMER
(
    CUSTOMER_ID INTEGER NOT NULL,
    DETAIL_ID INTEGER NOT NULL,
    PRIMARY KEY( CUSTOMER_ID ),
    CONSTRAINT cust_fk FOREIGN KEY( DETAIL_ID ) REFERENCES DETAILS( DETAIL_ID )
)

CREATE TABLE DETAILS
(
    DETAIL_ID INTEGER NOT NULL,
    OTHER INTEGER NOT NULL,
    PRIMARY KEY( DETAIL_ID )
)

我想将这些表映射到一个名为 Customer 的类,所以我有:

@Entity
@Table(name = "CUSTOMERS")
@SecondaryTable(name = "DETAILS", pkJoinColumns=@PrimaryKeyJoinColumn(name="DETAIL_ID"))
public class Customer {
    @Id
    @GeneratedValue
    @Column(name = "CUSTOMER_ID")
    private Integer id;

   @Column(table = "DETAILS", name = "OTHER")
   private Integer notes;

   // ...
}

但这仅在DETAIL_ID 与主表中的CUSTOMER_ID 匹配时才有效。

所以我的问题是:如何使用主表中的外键字段来加入辅助表的主键?


更新 我尝试设置:

@SecondaryTable(name = "DETAILS", pkJoinColumns=@PrimaryKeyJoinColumn(name="DETAIL_ID", referencedColumnName="DETAIL_ID"))

但是当我运行应用程序时,我得到了这个异常:

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

【问题讨论】:

  • 好的,所以你有两个表,你想把它们连接到一个表中?
  • @SerenityStackHolder 是的,我想在一个实体上映射两个表。但是我在主表中有一个外键到辅助表。

标签: java hibernate jpa


【解决方案1】:

对于任何寻找此问题的答案的人,使用@SecondaryTable 不是连接具有非主键列的两个表的方法,因为默认情况下,Hibernate 将尝试通过主键关联这两个表;您必须使用@OneToMany 评论http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/ 来获得解决方案,这是一个代码 sn-p,以防 url 停止工作:

客户类别:

@Entity
@Table(name="CUSTOMERS")
public class Customer {

    @Id
    @GeneratedValue
    @Column(name="CUSTOMER_ID")
    private Integer id;

    @ManyToOne
    @JoinColumn(name="DETAIL_ID")
    private Details details;

    // Getter and Setter methods...
}

细节类:

@Entity
@Table(name="DETAILS")
public class Details {

    @Id
    @GeneratedValue
    @Column(name="DETAIL_ID")
    private int detailId;

    @Column(name="OTHER")
    private String other;

    @OneToMany(mappedBy="details")
    private Set<Customer> customers;

    // Getter and Setter methods...
}

这很容易通过休眠使用以下代码访问:

Session session = HibernateUtil.getSessionFactory().openSession();
Query query = session.createQuery("select id, details.other from Customer");

我希望这可以帮助那些像我一样花费数小时寻找实现这一目标的方法的人。

【讨论】:

  • 这不会像 OP 想要的那样将两个表映射到一个实体中,这是通常的双向一对多映射
【解决方案2】:

您可以使用@PrimaryKeyJoinColumn 注释的referenceColumnName 属性来定义被引用表的连接列。事实上,通过结合使用 name/referencedColumnName,您可以任意加入,但如果发现重复项,您的 ORM 提供程序将抛出异​​常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多