0

A让我们以两个实体和为例B。每个A可能有许多关联B的 s。每个B都与一个 相关联A。我将这种与 Hibernate 的关系表示如下:

@Entity
public class A {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "AId")
    private Long id;

    @Column(name = "AName", nullable = false, unique = true)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "AId") }, inverseJoinColumns = { @JoinColumn(name = "BId") })
    private Set<B> bs = new HashSet<B>();

}


@Entity
public class B {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "BId")
    private Long id;

    @Column(name = "BName")
    private String name;

    @ManyToOne(optional = false)
    @JoinColumn(name = "BA")
    private A a;

}

当我从这个映射生成数据库时,这就是我得到的:

  • A
  • A_B具有 2 列的连接表:AIdBIdAId并且BId属于主键。OneToMany并且由于从Ato存在关联B(即,一个A可能有许多关联B的 s,而一个B与恰好一个关联A),因此在 上添加了唯一约束BId
  • 包含列的表B,包括BA哪个是 table 的关键foreign引用列。AIdA

关于join table,

  • 为什么 Hibernate 以OneToMany这种方式映射关系?
  • 它可以简单地将主键定义为由一列 ( BId) 组成,并且将执行相同的规则。
  • 以这种方式完成映射是否有原因?
  • 这种映射的优点/缺点是什么?

我准确地说我正在使用Hibernate 4.1.6.Final.

4

1 回答 1

0

我看到您正在尝试映射双向关联:从 A 到 B,从 B 到 A。

关于连接表,为什么 Hibernate 以这种方式映射 OneToMany 关系?

因为您指定了一个连接表。您可以在没有它的情况下映射 @OneToMany 关系:

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "AId", nullable = false)
private Set<B> bs = new HashSet<B>();

或者更好,因为你有一个双向关联:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")  
private Set<B> bs = new HashSet<B>();

...

@ManyToOne(optional = false)  
@JoinColumn(name = "AId", nullable = false)  
private A a;

关于

以这种方式完成映射是否有原因?这种映射的优点/缺点是什么?

当您有一个可选的一对多时,与连接表的映射很有用,例如,如果 B 可能没有 A。它允许您避免 B 表上的可为空的 AId 列。

于 2012-08-23T15:16:12.197 回答