2012-05-02 54 views
3

我遇到了一个与此非常相似的问题: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", [email protected](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

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


UPDATE 我试图设置:

@SecondaryTable(name = "DETAILS", [email protected](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

+0

好的,所以你有两张桌子,你想把它们加入一张桌子吗? –

+0

@SerenityStackHolder是的,我想要在单个实体上映射两个表。但是我在辅助表的主表中有一个外键。 – davioooh

回答

0

可以使用referenceColumnName的属性注释将联接列定义到引用的表。事实上,通过组合使用name/referencedColumnName,你可以在任意两端进行连接,限制条件是如果找到重复项,你的ORM提供者将抛出一个异常。

+0

我更新了我的问题 – davioooh

3

对于任何寻找答案的人来说,使用@SecondaryTable不是用非主键列连接两个表的方法,因为Hibernate默认会尝试通过它们的主键来协调这两个表;你必须使用@OneToMany审查http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/一个解决方案,这里有万一的代码片段网址停止工作:

Customer类:

@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"); 

我希望这能帮助那些花费数小时寻找像我一样达到这个目标的人。

相关问题