如何使用链接表在Hibernate中映射多对多列表

我想使用链接表在Hibernate中映射多对多。 我有两个类,父类和子类,例如:

public class Parent{ private List _children; //...getters and setters } 

我使用链接表(link_table),其中包含三列link_idparent_idchild_id 。 数据库是SQL服务器,id类型是uniqueidentifier。 所以,我通常使用guid作为id字段。

如果这是要使用的正确标记,如何使用标记实现此目的? 你知道有什么好的文件来完成这个吗?

我目前正在获取ConstraintViolationException,但未能找到任何好的文档或示例。

我认为一个主要问题是:如何指定link_id在链接表中自动生成。

我不认为可以(或必要)将link_id主键添加到连接表。 连接表通常由两个参与表的主键组成。

使用XML你需要这样的语法:

   ....     ...   ...     ...  

虽然我发现注释更好用。

我这样做是使用注释,特别是@ManyToMany和@JoinTable:

Hibernate Docs:

 @Entity public class Employer implements Serializable { @ManyToMany( targetEntity=org.hibernate.test.metadata.manytomany.Employee.class, cascade={CascadeType.PERSIST, CascadeType.MERGE} ) @JoinTable( name="EMPLOYER_EMPLOYEE", joinColumns=@JoinColumn(name="EMPER_ID"), inverseJoinColumns=@JoinColumn(name="EMPEE_ID") ) public Collection getEmployees() { return employees; } } @Entity public class Employee implements Serializable { @ManyToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, mappedBy = "employees", targetEntity = Employer.class ) public Collection getEmployers() { return employers; } } 

我不确定您是否可以轻松地为具有现有数据的现有数据库提供此function。 Hibernate通常最好在你第一次连接时定义自己的数据模式…

我只使用注释来提取多对多,但我认为hibernate文档提供了基于XML的示例: 链接文本

我在网上发现了一个非常好的博客,它提供了两种方法来为多对多映射的hibernate列添加其他字段。 传统上我们期望多对多的映射给出一个新的表,FK的表映射。 但是有一些方法可以调整它并为此连接表添加更多字段/列。

此连接表可能包含PK或可能包含一些没有PK的额外字段。 有关具体实施, 请参阅此博客

根据您的示例,您需要在表中添加额外的PK,以便声明一个新表ParentChildren并将主键声明为l​​inkId。 我只显示了已取消的父子类,因为父类和子类中的多对多映射的注释可以从上面的post中引用。

 @Entity @Table(name = "parent_children") public class ParentChildren{ @Id @GeneratedValue private long linkId; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "parent_id") private Parent parent; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "children_id) private Children children; // additional fields if you want private boolean activated; //getters and setters } } 

因此,这将创建一个映射表,其中linkId作为主键,parent_id和children_id作为外键。 只需清楚为什么你想单独将link_id作为主键以及如何使用它。