@ManyToMany 使用@JoinTable
@ManyToMany using @JoinTable
我有以下两个实体和一个连接 table:
实体:
@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
}
我在数据库中有一个连接 table,它被命名为 "READER_BOOKS",它由两列组成 - readerId 和 bookId - 两者都是主键作为对,每一列都是对应 table.
的外键
一些细节:
- 我在Reader.java中定义了一个"ManyToMany"关系,意思是
一个reader可以有很多书,而且书可以在其他地方重复使用
readers(例如,另一个 reader 可以拥有与其他人相同的书籍
readers)。另外,正如您所看到的 reader id 和 person id 是
相同 - 所以我定义了一个 "OneToOne" 关系 - 效果很好。
- 在书籍实体 class 中,我没有添加参考或声明任何内容
关系,因为我明白我不需要。
问题:
当我添加一个人并用几本书设置 reader 字段时,它起作用了,数据库中填充了正确的值。(一个人,reader 并加入 tables 插入新行)
问题是当我删除 Person 实例或 Reader 实例并且 books 实例不为空时(书籍分配给 reader)。休眠只是卡住了,没有抛出任何异常。
但是当书籍实例为空时(没有将任何书籍分配给reader)删除成功。
我认为 "ManyToMany" 可能有问题,因为当连接 table 为空时删除成功。
我的实现有什么问题?
已编辑:我发现即使该列表为空,有时休眠也会卡住,所以我认为 "OneToOne" 注释也有问题,也许我错过了一些东西
我的实现没有问题。
我使用 PL/SQL 开发人员,但我没有注意到,但它获得了其中一张表的锁:|。
所以当我试图删除一条记录时,hibernate 卡住了,出于某种原因没有抛出任何错误。
无论如何,实现是正确的。
我有以下两个实体和一个连接 table:
实体:
@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
}
我在数据库中有一个连接 table,它被命名为 "READER_BOOKS",它由两列组成 - readerId 和 bookId - 两者都是主键作为对,每一列都是对应 table.
的外键一些细节:
- 我在Reader.java中定义了一个"ManyToMany"关系,意思是 一个reader可以有很多书,而且书可以在其他地方重复使用 readers(例如,另一个 reader 可以拥有与其他人相同的书籍 readers)。另外,正如您所看到的 reader id 和 person id 是 相同 - 所以我定义了一个 "OneToOne" 关系 - 效果很好。
- 在书籍实体 class 中,我没有添加参考或声明任何内容 关系,因为我明白我不需要。
问题:
当我添加一个人并用几本书设置 reader 字段时,它起作用了,数据库中填充了正确的值。(一个人,reader 并加入 tables 插入新行)
问题是当我删除 Person 实例或 Reader 实例并且 books 实例不为空时(书籍分配给 reader)。休眠只是卡住了,没有抛出任何异常。 但是当书籍实例为空时(没有将任何书籍分配给reader)删除成功。
我认为 "ManyToMany" 可能有问题,因为当连接 table 为空时删除成功。
我的实现有什么问题?
已编辑:我发现即使该列表为空,有时休眠也会卡住,所以我认为 "OneToOne" 注释也有问题,也许我错过了一些东西
我的实现没有问题。 我使用 PL/SQL 开发人员,但我没有注意到,但它获得了其中一张表的锁:|。 所以当我试图删除一条记录时,hibernate 卡住了,出于某种原因没有抛出任何错误。
无论如何,实现是正确的。