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;