@Entity
@Table(name="PROPERTY_VALUES")
public class PropertyValuesData extends AbstractData {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="VAL_ID")
private Long id;
@OneToOne(fetch = FetchType.EAGER, cascade= {CascadeType.PERSIST} )
@JoinColumn(name = "VAL_PROP_ID")
private PropertyData property;
}
持久化对象:
public void createItem(TYPE item){
try{
em=EMFactory.createEntityManager();
em.getTransaction().begin();
em.persist(item);
em.getTransaction().commit();
}catch(Exception e){
logger.error("Error while createItem", e);
System.err.println(e.getMessage());
}finally {
if(em!=null)
em.close();
}
}
我有两种情况:1)我创建新的对象PropertyValuesData
,它包含现有的属性(id) ->然后我想只添加新的PropertyValuesData
2)我创建新的对象PropertyValuesData
,用新的属性->,然后我想插入新的PropertyData
。
如果我添加CascadeType.PERSIST
,那么我可以保存新属性,但对于现有的属性,它尝试再次插入。我该怎么做才能避免再次插入相同的属性?
尝试添加额外的CascadeType.MERGE
还要记住,PropertyData
需要是Managed
(所以在当前的持久化上下文中,而不是分离的)才能工作。如果您使用Detached
实体,将其id
设置为db中的某个值,这将导致INSERT
而不是UPDATE
。
要使其100%工作,只需SELECT
需要PropertyData
从db(即使是id
,就像你正在尝试,设置它,然后坚持PropertyValuesData