Transactions Ejb3 CMT未提交外键约束

Transactions Ejb3 CMT未提交外键约束,transactions,foreign-keys,ejb-3.0,Transactions,Foreign Keys,Ejb 3.0,我正在尝试进行一项交易: 创建一个客户端 创建具有外键的地址到客户端表 将客户端的合成外键更新到地址表 问题: 运行testMethod()时,我得到一个java.sql.SQLIntegrityConstraintViolationException 关于地址的限制 如果我在一个事务中更改代码并创建客户机,然后在另一个事务中创建地址并更新客户机字段,则一切正常 如果我更改代码,在一个事务中创建客户机和地址,并在另一个事务中更新客户机字段,那么一切都会正常工作 如果我使用nativequerie

我正在尝试进行一项交易:

  • 创建一个客户端
  • 创建具有外键的地址到客户端表
  • 将客户端的合成外键更新到地址表
  • 问题:

  • 运行testMethod()时,我得到一个java.sql.SQLIntegrityConstraintViolationException 关于地址的限制
  • 如果我在一个事务中更改代码并创建客户机,然后在另一个事务中创建地址并更新客户机字段,则一切正常
  • 如果我更改代码,在一个事务中创建客户机和地址,并在另一个事务中更新客户机字段,那么一切都会正常工作
  • 如果我使用nativequeries而不是EntityManager中的persist and merge方法,一切正常

    @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主键
    -NMORADAPRI可为空

    外键(IDCLIENTE,NMORADAPRI)引用地址(IDCLIENTE,IDMORADA)

    组合键

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