我有两个这样的实体(第二个与第一个有关系):
@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创建新的foaaddresseicx在数据库中,如果不存在。
使用基本类型作为DB id有您目前正在经历的缺点。默认值是0
,这是一个完全有效的DB id值。
持久性提供程序假定实体不是新的,而是分离的,并据此进行行为。
解决方案是使用包装类(或其他非原语类,如UUID
)作为id -在您的情况下是Long
。除非显式实例化,否则id属性将为null
,并且提供者将正确地将实体识别为new。