Java 在路上,Hibernate映射了一个单一的关系
让我们以两个实体Java 在路上,Hibernate映射了一个单一的关系,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,让我们以两个实体A和B为例。每个A可能有许多相关的Bs。每个B都与一个A关联。我对Hibernate的这种关系表示如下: @Entity public class A { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "AId") private Long id; @Column(name = "AName", nullable = false, unique =
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类{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“AId”)
私人长id;
@列(name=“AName”,nullable=false,unique=true)
私有字符串名称;
@OneToMany(级联=级联类型.ALL)
@JoinTable(name=“A_B”,joinColumns={@JoinColumn(name=“AId”)},inverseJoinColumns={@JoinColumn(name=“BId”)})
私有集bs=新HashSet();
}
@实体
公共B级{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“BId”)
私人长id;
@列(name=“BName”)
私有字符串名称;
@多通(可选=假)
@JoinColumn(name=“BA”)
私人A;
}
当我从这个映射生成DB时,我得到的是:
- 表
A
- 包含两列的联接表
:A\u B
和AId
<代码>辅助和BId
属于主键。由于从投标
到a
之间存在B
关联(即一个OneToMany
可能有多个关联的a
,而一个B
恰好与一个B
关联),因此在a
上添加了唯一的约束BId
- 表
中的列包括B
,BA是表BA
的a
键引用列外部
AId
联接表
- 为什么Hibernate以这种方式映射
关系李>OneToMany
- 它可以简单地将主键定义为包含一列(
),并执行相同的规则李>BId
- 有没有这样做的原因李>
- 这种映射的优点/缺点是什么
我使用的是
hibernate4.1.6.Final
我看到您正在尝试映射一个双向关联:从a到B,从B到a
关于连接表,为什么Hibernate以这种方式映射OneToMany关系
因为您指定了一个联接表。您可以映射@OneToMany关系,但不映射它:
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "AId", nullable = false)
private Set<B> bs = new HashSet<B>();
关于
有没有这样做的原因?有什么问题
这种映射的优点/缺点
当您有可选的一对多(例如,B可能没有A)时,使用联接表的映射非常有用。它允许您避免在B表上使用可为空的AId列。使用Hibernate创建表不是一个好做法。我从未对一对多关系使用过联接列。您应该规范化数据库表。
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private Set<B> bs = new HashSet<B>();
@ManyToOne(optional = false)
@JoinColumn(name = "AId", nullable = false)
private A a;