Dropwizard Hibernate 1.0.0

时间:2016-11-06 12:35:26

标签: java hibernate dropwizard

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

@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,将其设置为可用性,然后对具有修改后可用性的人员执行更新?在我看来,这只是错误的。

1 个答案:

答案 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上删除了双向引用,即删除了人值引用。

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

现场注释策略不是问题所在。