3

我有一个与此非常相似的问题:如何在辅助表中的非主键列上连接表? 但我不确定我是否可以应用相同的解决方案。

我有两个这样的表:

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

4

2 回答 2

3

对于正在寻找答案的任何人,使用 @SecondaryTable 不是连接两个具有非主键列的表的方法,因为默认情况下 Hibernate 将尝试通过主键关联这两个表;您必须使用@OneToMany 审查http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/以获得解决方案,这是一个代码片段,以防 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...
}

这可以通过 hibernate 使用以下代码轻松访问:

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

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

于 2014-06-20T19:51:08.573 回答
0

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

于 2012-05-02T16:57:07.950 回答