gpt4 book ai didi

java - @ManyToMany 使用@JoinTable

转载 作者:行者123 更新时间:2023-12-01 11:33:12 25 4
gpt4 key购买 nike

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

实体:

@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 实例并且书籍实例不为空(书籍被分配给读者)时。 hibernate 只是卡住了并且没有抛出任何异常。但是当图书实例为空(没有向读者分配任何图书)时,删除成功。

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

我的实现有什么问题?

编辑:我发现即使该列表为空, hibernate 有时也会卡住,所以我认为“OneToOne”注释也有问题,也许我错过了一些东西

最佳答案

我的实现没有问题。我使用 PL/SQL Developer,我没有注意到,但它获得了其中一张表的锁:|。因此,当我尝试删除记录时,hibernate 卡住了,并且由于某种原因没有抛出任何错误。

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

关于java - @ManyToMany 使用@JoinTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30257042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com