私は次のトランザクションを実行しようとしています:
- クライアントを作成します
- Client テーブルへの外部キーを持つ Address を作成します
- クライアントの合成外部キーを Address テーブルに更新します
問題:
- testMethod() を実行すると 、ADDRESSES の制約に関してjava.sql.SQLIntegrityConstraintViolationExceptionが発生します。
- コードを変更して 1 つのトランザクションでクライアントを作成し、別のトランザクションでアドレスを作成してクライアント フィールドを更新すると、すべて正常に動作します
- コードを変更して、あるトランザクションでクライアントとアドレスを作成し、別のトランザクションでクライアント フィールドを更新すると、すべて正常に動作します
EntityManager からの永続化およびマージ メソッドの代わりにネイティブクエリを使用すると、すべて正常に動作します
@Stateless public class Test implements TestLocal { @PersistenceContext(unitName = "testPU") private EntityManager em; @Override public void testMethod(Client client, Address address, boolean mainAddress) { client.setIdcliente(new Long(110)); em.persist(client); address.setAddressPK(new AddressPK(new Long(120), client.getIdcliente())); em.persist(address); if (mainAddress) { client.setMainAddress(address); em.merge(client); } }
私のモデル:
クライアント:
- IDCLIENTE pk
- NMORADAPRI nullable
外部キー (IDCLIENTE、NMORADAPRI) 参照アドレス (IDCLIENTE、IDMORADA)
@Entity
@Table(name = "CLIENTS")
public class Client implements Serializable {
@Id
@Basic(optional = false)
@NotNull
@Column(name = "IDCLIENTE")
private Long idcliente;
@JoinColumns({
@JoinColumn(name = "IDCLIENTE", referencedColumnName = "IDCLIENTE", insertable = false, updatable = false),
@JoinColumn(name = "NMORADAPRI", referencedColumnName = "IDMORADA")})
@OneToOne(optional = false)
private Address main_address;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "client")
private Collection<Address> addressesCollection;
住所:
- IDMORADA pk
- IDCLIENTE pk
外部キー (IDCLIENTE) 参照クライアント (IDCLIENTE)
@Entity
@Table(name = "ADDRESSES")
public class Address implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
protected AddressPK addressPK;
@JoinColumn(name = "IDCLIENTE", referencedColumnName = "IDCLIENTE", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Client client;
コンポーズキー
@Embeddable
public class AddressPK implements Serializable {
@Basic(optional = false)
@NotNull
@Column(name = "IDMORADA")
private long idmorada;
@Basic(optional = false)
@NotNull
@Column(name = "IDCLIENTE")
private long idcliente;