7

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

public class Parent{

private List<Child> _children;

//...getters and setters
}

我使用具有三列link_idparent_id和的链接表 (link_table) child_id。数据库是 SQL server,id 类型是 uniqueidentifier。因此,我通常将 guid 用于 id 字段。

<list />如果这是要使用的正确标签,您如何使用该标签来实现这一点?你知道有什么好的文档来完成这个吗?

我目前正在收到 ConstraintViolationException,但找不到任何好的文档或示例。

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

4

4 回答 4

8

我使用注释来做到这一点,特别是@ManyToMany 和@JoinTable:

休眠文档:

@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;
    }
}
于 2008-12-23T01:30:42.133 回答
5

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

使用 XML,您将需要如下语法:

 <class name="Parent">
    ....
    <list name="children" table="link_table">
    <key column="parent_id"/>
    <many-to-many column="child_id"
        class="Children"/>
    </list>
    ...
 </class>

<class name="Child">
...
<list name="parents" inverse="true" table="link_table">
    <key column="child_id"/>
    <many-to-many column="parent_id"
        class="Parent"/>
</list>
...
</class>

虽然我发现注释更好用。

于 2008-12-23T02:49:50.787 回答
0

我不确定您是否可以轻松地为具有现有数据的现有数据库完成此操作。Hibernate 通常最好在您第一次连接时定义自己的数据模式......

我只用注释完成了多对多,但我认为休眠文档提供了基于 XML 的示例:链接文本

于 2008-12-23T00:33:08.287 回答
0

我在网上找到了一个非常好的博客,它提供了两种方法来向多对多映射的休眠列添加额外的字段。传统上,我们期望多对多映射给一个新表将 FK 的表映射。但是有一些方法可以调整它并向这个连接表添加更多字段/列。

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

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

@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 作为主键以及如何使用它。

于 2016-10-21T07:34:52.250 回答