【问题标题】:@ManyToMany using @JoinTable@ManyToMany 使用 @JoinTable
【发布时间】:2015-05-15 10:20:24
【问题描述】:

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

实体:

@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
}

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

一些细节:

  • 我在 Reader.java 中定义了“ManyToMany”关系,意思是 一个读者可以拥有很多本书,并且书籍可以在其他地方重复使用 读者(例如,另一个读者可以拥有与其他读者相同的书籍) 读者)。同样如您所见,读者 id 和人员 id 是 同样 - 所以我定义了一个“OneToOne”关系 - 效果很好。
  • 在书籍实体类中我没有添加参考或说明任何 关系,因为我明白我不需要。

问题:

当我添加一个 Person 并用几本书设置 reader 字段时,它可以工作,并且数据库中填充了正确的值。(一个 person、reader 和 join 表插入了新行)

问题是当我删除 Person 实例或 Reader 实例并且 books 实例不为空(书籍已分配给 reader)。 hibernate 只是卡住了,没有抛出任何异常。 但是当 books 实例为空时(没有给读者分配任何图书)删除成功。

我认为“ManyToMany”可能有问题,因为当连接表为空时,删除成功。

我的实现有什么问题?

已编辑:我发现有时即使该列表为空,休眠也会卡住,所以我认为“OneToOne”注释也有问题,也许我错过了什么

【问题讨论】:

  • 对于多对多可以像这样更改注释@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  • 试过了,没有任何影响
  • 当您将书籍添加到阅读器时,它们会被持久化吗?可以将此添加到 Person on reader 属性(一对一)@PrimaryKeyJoinColumn
  • 是的,它们是持久的。我添加了 PrimaryKeyJoinColumn 并且它可以工作,但是现在我删除了 PrimaryKeyJoinColumn 并且由于某种原因它仍然可以工作。怎么可能?
  • 奇怪的是你的映射似乎正确

标签: java hibernate many-to-many


【解决方案1】:

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

无论如何,实现都是正确的。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2012-06-03
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2018-10-21
    相关资源
    最近更新 更多