我在Hibernate(版本5.4.2)中存在并发问题:一个实体(类Group)始终具有其他实体(类Member)的准确列表,这一点很重要。我与 @OneToMany 和 @ManyToOne 和 @JoinColumn 使用了双向关系:
@Entity
public class Group {
@Id
@GeneratedValue
private Long id;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "group")
private Set<Member> memberList = new HashSet<>();
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "groupMember_id")
private Group group;
}
作为数据库,我使用MySQL:
CREATE TABLE `Group` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
CREATE TABLE `Member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`groupMember_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
ALTER TABLE `Member` ADD KEY `FK_2vbvsrpwxwnqbd0rud8kfr9ur` (`groupMember_id`);
ALTER TABLE `Member` ADD CONSTRAINT `FK_2vbvsrpwxwnqbd0rud8kfr9ur` FOREIGN KEY (`groupMember_id`) REFERENCES `Group` (`id`);
问题是,如果我在一个事务中将新创建的成员添加到组的memberList中,其他并发事务则看不到-它们得到了错误的memberList。
到目前为止我尝试过的事情:
类似于https://www.baeldung.com/jpa-pessimistic-locking中的 LockModeType.PESSIMISTIC_WRITE (带有或不带有 PessimisticLockScope.EXTENDED )的说明,带有“查找”和“查询”。 / p>
然后我尝试将<property name="hibernate.connection.isolation" value="8"/>
添加到我的 persistence.xml 中。根据{{3}},这会将隔离级别设置为Serializable:
Serializable-这是最严格的隔离级别,将存在可伸缩性问题。这样可以防止脏读,幻像读,不可重复读等。事务是串行执行的(一个接一个),并获得对整个受影响数据集的读写锁定。