在Hibernate映射OneToMany关系的路上

时间:2012-08-23 14:39:46

标签: java hibernate hibernate-mapping

我们以两个实体AB为例。每个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
  • 包含2列的联接表A_BAIdBIdAIdBId属于主键。由于OneToManyA之间存在B关联(即一个A可能有多个关联的B,一个B是只与一个A相关联,BId上会添加一个唯一约束。
  • B,其中包含BA列,foreign键引用表AId的列A

关于join table

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

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

1 个答案:

答案 0 :(得分: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列。