@ManyToMany使用@JoinTable

时间:2015-05-15 10:20:24

标签: java hibernate many-to-many

我有以下两个实体和一个连接表:

实体:

@Entity
@Table(name = "PERSON")
public class parent {

@OneToOne(mappedBy="person", cascade= CascadeType.ALL)
 private Reader reader;

//more fields and getters and setters and of course @Id.....
}

和另一个实体:

@Entity
@Table(name="READER")
public class Reader{

 @Id
 @Column(name= "READER_ID")
 @GeneratedValue(generator="gen")  
 @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="Person"))  
 private long readerId;

 @OneToOne  
 @PrimaryKeyJoinColumn  
 private Person person;

 @ManyToMany(fetch = FetchType.EAGER)
 @JoinTable(name = "READER_BOOKS", joinColumns={@JoinColumn(name="READER_ID")}, inverseJoinColumns={@JoinColumn(name="BOOK_ID")})
 private List<Books> books;

//more fields and getters and setters
}

我在数据库中有一个连接表,名为&#34; READER_BOOKS&#34;它由两列组成 - readerId和bookId - 两者都是一对主键,每列都是相应表的外键。

一些细节:

  • 我定义了一个&#34; ManyToMany&#34; Reader.java中的关系,意思是 读者可以拥有许多书籍,书籍可以在其他书籍中重复使用 读者(例如另一位读者可以拥有与其他读者相同的书籍 读者)。另外,您可以看到读者ID和人员ID是 同样 - 所以我定义了一个&#34; OneToOne&#34;关系 - 工作正常。
  • 在图书实体课程中,我没有添加引用或声明任何内容 关系,因为我明白我不需要。

问题:

当我添加一个Person并在读者字段中设置了几本书时,它可以工作,并且数据库中填充了正确的值。(一个人,读者和连接表插入了新行)

问题是当我删除Person实例或Reader实例AND books实例不为空 (书籍被分配给读者)。 hibernate只是卡住而不是抛出任何执行。 但是当图书实例为空 (没有将任何图书分配给读者)时删除成功。

我认为&#34; ManyToMany&#34; ,因为当连接表为空时删除成功。

我的实施有什么问题?

编辑:我发现即使该列表为空,有时候hibernate也会卡住,所以我认为&#34; OneToOne&#34; anottation,也许我错过了一些东西

1 个答案:

答案 0 :(得分:1)

我的实施没有问题。 我使用PL / SQL开发人员,我没有注意到,但它获得了其中一个表的锁定:|。 所以当我试图删除一条记录时,hibernate卡住了,并且由于某些原因没有抛出任何错误。

任何方式,实施都是正确的。