与JPA和子类ID合并

时间:2014-07-24 12:09:31

标签: jpa

我有两个这样的实体(第二个与第一个有关系):

@Entity
@Table(name="FOA_ADRESSE_ICX")
public class FoaAdresseIcx implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ID_ADRESSE", unique=true, nullable=false, precision=5)
    private long idAdresse;

    @Column(length=32)
    private String bat;

    @Column(name="COD_POSTAL", length=5)
    private String codPostal;

    // getters and setters ....
}

@Entity
@Table(name="FOA_INFOS_ICX")
public class FoaInfosIcx implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="COD_ICX", unique=true, nullable=false, length=8)
    private String codIcx;

    @Column(name="DATE_RAFFRAICHISEMENT")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateRaffraichisement;

    @Column(name="LIB_AGENCE", nullable=false, length=98)
    private String libAgence;

    //uni-directional many-to-one association to FoaAdresseIcx
    @ManyToOne
    @JoinColumn(name="ID_ADRESSE", nullable=false)
    private FoaAdresseIcx foaAdresseIcx;

    // getters and setters....
}

我遇到了合并问题:

myEntityMgr.merge(myFoaInfosIcx);

得到了这个例外:

GRAVE: EJB Exception: : javax.persistence.EntityNotFoundException: Unable to find com.groupama.middlgan.entities.FoaAdresseIcx with id 0

myFoaInfosIcx中,ID为0,因为我没有初始化它,因为如果不存在,我希望JPA在数据库中创建新的FoaAdresseIcx。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

使用原始类型作为数据库ID有一个你正在经历的缺点。默认值为0,这是数据库ID的完全有效值。

持久性提供程序假定该实体不是新实体,而是分离并相应地运行。

解决方案是在您的情况下使用包装类(或其他非基本类,如UUID)作为ids - Long。除非明确实例化,否则id属性将为null,提供者将正确地将实体标识为新实体。