2011-08-26 39 views
2

以下是详细信息。休眠如何在中间表中添加一列

我有2个具有一对多关系的实体表。

首先,Exam类有很多Category类。 Hibernate的生成此表

______________ 
Exam 
- Id 
- Name 
- Category 
______________ 
Category 
- Id 
- Name 
______________ 
Exam_Category 
- Exam_Id 
- Category_Id 

我需要在Exam_Category表 前添加一个额外的列:

______________ 
Exam_Category 
- Exam_Id 
- Category_Id 
* User_Id 

我应该如何去做到这一点。如果有的话,我怎样才能得到user_id的价值,因为Exam_Category没有公开。谢谢

+1

为什么你有一个额外的表,当你没有“多对多”的关系? – Tair

+1

您可以在考试课程中使用地图<类别,用户>字段。参见[这篇文章] [1] [1]:http://stackoverflow.com/questions/7179538/hibernate-xml-mapping-of-ann-table-with-extra-columns/7187557# 7187557 –

回答

0

这是涉及三个表(三个外键)的多对多关系的情况。这在Hibernate中不能通过简单的映射来实现。您将不得不扩展您对实体类的定义以支持“中间”表上的自定义主键列。·

检出this参考。

1

这样做的最好方法是使用一组元素。

@Entity 
public class Exam { 
    @CollectionOfElements(fetch = FetchType.LAZY) 
    @JoinTable(name = "EXAM_CATEGORY", joinColumns = @JoinColumn(name = "FK_EXAM")) 
    public Set<CategoryEntry> getCategories() { 
     return this.categories; 
    } 
} 

@Embeddable 
public class CategoryEntry{ 

    private Category category; 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "FK_CATEGORY", nullable = false) 
    public Category getCategory() { 
     return this.category; 
    } 

    @ManyToOne 
    @JoinColumn(name = "FK_USER", nullable = false) 
    public User getUser() { 
     return this.user; 
    } 

// ... setters and such 

} 

@Entity 
public class Category { 
} 

这种方法比将它映射为实体更清洁,因为在逻辑上它不是以实体开始。

然后,您可以在Exam中添加一些其他方法来获取所有类别(无用户)或将其作为地图或任何其他方法检索。如果需要,可以通过封装完全隐藏该中间对象。

+0

我认为这很好,但我没有使用注释。当我将应用程序更改为注释时,我会尝试此操作。非常感谢.. – frank

+0

我并不确定,但我认为Hibernate的所有功能也可以通过映射xmls来实现。我想你可以做同样的事情。 –

0

您可以在考试课程中使用地图字段。见this post