如何将数据插入Hibernate托管的Bridge表或Join表?

时间:2016-08-23 10:11:19

标签: java hibernate

当它是Hibernate管理的Bridge表时,没有与Bridge表关联的POJO类。如何将数据插入其中。

您可以考虑情景很多学生都有很多课程。

如何在更新学生或课程表时将数据存储到student_course表中。

以下代码片段用于理解目的并测试结果

    Student student = new Student();
    student.setName("abc");
    List<Course> courses = new ArrayList<Course>();
    Course course1 = new Course();
    course1.setName("course1");
    Course course2 = new Course();
    course2.setName("course2");
    Course course3 = new Course();
    course3.setName("course3");
    courses.add(course1);
    courses.add(course2);
    courses.add(course3);
    student.setCourses(courses);
    session.save(student);
    session.close();

上面的代码只是在两个表中插入数据。 但是没有迹象表明course1,course2和course3属于student,因为它没有在student_course表中保存数据。

1 个答案:

答案 0 :(得分:1)

桥接/连接/交叉表由多对多关系表示,或由表示关系的单独实体表示。

多对多的例子:

Person
    List<Club> clubs;

Club
    List<Person> members;

cross table person_club (person_id, club_id);

这里的俱乐部和成员处于多对多关系中,映射到交叉表。如果您向俱乐部或俱乐部添加会员,则在保存实体时会将数据添加到交叉表中。

实体示例:

Article

User

Tag
    String label;

ArticleUserTag
    Article article;
    User user;
    Tag tag;

cross table article_user_tag (article_id, user_id, tag_id)

此处ArticleUserTag是表示文章,用户和标签之间关系的实体。要标记文章,必须使用所需的文章,用户和标记创建新的ArticleUserTag实例。保存后,数据将插入到交叉表中。

编辑:不要在学生上设置新列表。试试这个:

学生班:

public class Student {

   private List<Course> courses;

   @ManyToOne(....)
   public List<Course> getCourses() {
       return courses;
   }
}

代码中的某处:

try {
    Student student = new Student();
    student.setName("abc");
    session.save(student);   

    Course course1 = new Course();
    course1.setName("course1");
    session.save(course1);  

    Course course2 = new Course();
    student.setName("abc");
    session.save(course2);  

    student.getCourses().add(course1);
    student.getCourses().add(course2);
    session.save(student);         
}
finally {
    // always close in finally block, or use Java 8's try-with-resources
    session.close(); 
}