2016-11-06 5 views
0

多くの人が外部キーを更新していない1対多の関係間の双方向マッピングに問題があります。更新/作成を実行するとnullのままです。 2つのエンティティ、最初の(多くの)があり、このされています。第二は一つですDropwizard Hibernate 1.0.0

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

あり、これを引き起こしている可能性があります物事のカップルがありますが、私は不確かです本当の理由は何か最初は、人は抽象であるということです。しかし、私が使用している継承型は、この問題を引き起こすべきではありません。

2番目は、1つのトランザクションでエンティティを永続化しようとしている方法です。私はdropwizardの@UnitOfWorkを使用しています。私のDAOは次のようにしています:

public Staff update(Staff staff) { 
    return persist(staff); 
} 

この時点でのスタッフにはIDがありません。可用性は、ボンネットの下に(また、IDなし)人に

に設定されている、これは単純に次のことを呼んでいる:

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

私は、新しいトランザクションを開いた人を永続化、取得するためにセッションマネージャを使用する必要がありますIDバック、可用性を設定して、変更された可用性を持つ人物とのアップデートを実行しますか?それは私にはちょうど間違っているようです。

答えて

1

問題は本当に双方向の関係ではなく、Personは決して利用可能に設定されていないということです。そのため、外部キーがnullだったのはなぜですか。

単方向に変更しました。 Person.class

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

、次いでAvailability.class上で

I、すなわち人の値の参照を削除し、双方向の参照を除去します。

その他の変更は、カスケード型のトランザクション戦略を設定することでした。

フィールドアノテーション戦略はここでは問題になりません。

関連する問題