Hibernate如何在中间表中添加列

时间:2011-08-26 06:18:38

标签: java hibernate hql

这是详细信息。

我有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未公开。感谢

3 个答案:

答案 0 :(得分: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中添加一些其他方法来获取所有类别(没有用户)或将其作为地图或其他任何方式检索。如果需要,您可以通过封装完全隐藏此中间对象。

答案 1 :(得分:0)

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

查看this参考。

答案 2 :(得分:0)

您可以在Exam类中使用Map字段。见this post