2

私は次のトランザクションを実行しようとしています:

  1. クライアントを作成します
  2. Client テーブルへの外部キーを持つ Address を作成します
  3. クライアントの合成外部キーを Address テーブルに更新します

問題:

  1. testMethod() を実行すると 、ADDRESSES の制約に関してjava.sql.SQLIntegrityConstraintViolationExceptionが発生します。
  2. コードを変更して 1 つのトランザクションでクライアントを作成し、別のトランザクションでアドレスを作成してクライアント フィールドを更新すると、すべて正常に動作します
  3. コードを変更して、あるトランザクションでクライアントとアドレスを作成し、別のトランザクションでクライアント フィールドを更新すると、すべて正常に動作します
  4. 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;
4

0 に答える 0