我遇到了一对多关系之间的双向映射问题,其中许多人没有更新它的外键 - 在执行更新/创建时它仍为空。有两个实体,第一个(很多)就是这个:
@Entity
@Table(name = "availability")
public class Availability implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PERSON_ID", nullable = false)
private Person person;
第二个是:
@Entity
@Table(name = "PERSON")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "P")
public abstract class Person implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person")
private Collection<Availability> availabilities;
有几件事可能导致这种情况,但我不确定真正的原因是什么。首先是Person是抽象的。但是我使用的继承类型不应该导致这个问题。
第二种是我试图在单个事务中持久保存实体的方式。我正在使用dropwizard的@UnitOfWork。我的DAO正在做以下事情:
public Staff update(Staff staff) {
return persist(staff);
}
此时的工作人员没有身份证。可用性在Person(也没有id)上设置
在幕后,这只是简单地调用以下内容:
protected E persist(E entity) throws HibernateException {
currentSession().saveOrUpdate(requireNonNull(entity));
return entity;
}
我是否应该使用会话管理器打开新事务,保留人员,获取ID,将其设置为可用性,然后对具有修改后可用性的人员执行更新?在我看来,这只是错误的。
答案 0 :(得分:2)
问题在于它并不是真正的双向关系,并且Person从未被设置为可用性 - 因此外键为空的原因。
我将其修改为单向。
在Person.class上
col1 | col2 | queue_count
-------------------------
1 |A |1
2 |B |3
3 |B |3
4 |B |3
5 |A |1
6 |B |2
7 |B |2
8 |A |1
然后在Availability.class上删除了双向引用,即删除了人值引用。
需要进行的其他更改是使用级联类型设置事务策略。
现场注释策略不是问题所在。