我们以两个实体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
:AId
和BId
。 AId
和BId
属于主键。由于OneToMany
与A
之间存在B
关联(即一个A
可能有多个关联的B
,一个B
是只与一个A
相关联,BId
上会添加一个唯一约束。B
,其中包含BA
列,foreign
键引用表AId
的列A
。关于join table
,
OneToMany
关系? BId
)组成,并且将强制执行相同的规则。 我确切地说我正在使用Hibernate 4.1.6.Final
。
答案 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列。