Dropwizard 休眠 1.0.0

Dropwizard Hibernate 1.0.0

我在一对多关系之间的双向映射中遇到问题,其中许多关系没有更新它的外键 - 在执行 update/create 时它仍然为空。有两个实体,第一个(很多)是这样的:

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

此时的工作人员没有 ID。可用性在 Person 上设置(也没有 id)

在幕后,这只是调用以下内容:

protected E persist(E entity) throws HibernateException {
    currentSession().saveOrUpdate(requireNonNull(entity));
    return entity;
}

我是否应该使用会话管理器来打开一个新的事务,持久化人员,取回 ID,将其设置为可用性,然后对具有修改可用性的人员执行更新?在我看来那是错误的。

问题在于它并不是真正的双向关系,而且 Person 从未设置为可用性 - 因此外键为空的原因。

我修改为单向的。

在 Person.class

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "person_availability")
private List<Availability> availabilities;

然后在 Availability.class 我删除了双向引用,即删除了 person 值引用。

需要进行的另一项更改是使用级联类型设置事务策略。

字段注释策略不是这里的问题。