1

JPAでHibernateを使用しており、次のような関係があります。

@Entity
@Table(name = "first")
public class First {
...
@OneToMany(mappedBy = "first")
private List<Availability> availabilities;
...
}


@Entity
@Table(name = "second")
public class Second {
...
@OneToMany(mappedBy = "second")
private List<Availability> availabilities;
...
}

@Entity
@Table(name="availability")
public class Availability implements Serializable {
@Id
@ManyToOne
@JoinColumn(name = "first_id")
private First first;

@Id
@ManyToOne
@JoinColumn(name = "second_id")
private Second second;

@Column(name = "availability")
private Integer availability;

...
hashcode and equals
}

これら 3 つのエンティティを個別に管理したいと考えています。最初と 2 番目は正常に動作しますが、merge() を実行しようとすると、3 番目の postgresql は ID の代わりに null 値を取得し、制約違反の例外がスローされます。なんで?このエンティティでマージを使用して、テーブルに新しい行を追加することはできますか?

更新:マージは次のようなものです:

public Availability setAvailability(Availability a) {
return em.merge(a);
}

可用性はフロントエンドから逆シリアル化されます (言及すると、「キー」クラスのコレクションはその中で切り離されます)。

4

2 に答える 2

0

複合 ID の使用を避けることで問題を解決しました。問題を再考した後、このケースでは実際に一意の制約を使用できることがわかりました。

@Entity
@Table(name = "availabilities", uniqueConstraints = { @UniqueConstraint(columnNames = {
    "first_id", "second_id" }) })
@SequenceGenerator(initialValue = 1, name = "availabilities_sequence", sequenceName =     "availabilities_sequence")
public class Availability implements IAvailability, Serializable {

private static final long serialVersionUID = -2977047920673617888L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "availabilities_sequence")
@Column(name = "id")
private Integer id;

@ManyToOne
@JoinColumn(name = "first_id", nullable=false)
private First first;

@ManyToOne
@JoinColumn(name = "second_id", nullable=false)
private Second second;

@Column(name = "availability", nullable=false)
private Integer availability;

...
}
于 2014-05-28T07:39:35.350 に答える