如果不存在JPA插入对象,则不执行任何操作


@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) ->然后我想只添加新的PropertyValuesData2)我创建新的对象PropertyValuesData,用新的属性->,然后我想插入新的PropertyData

如果我添加CascadeType.PERSIST,那么我可以保存新属性,但对于现有的属性,它尝试再次插入。我该怎么做才能避免再次插入相同的属性?

尝试添加额外的CascadeType.MERGE

还要记住,PropertyData需要是Managed(所以在当前的持久化上下文中,而不是分离的)才能工作。如果您使用Detached实体,将其id设置为db中的某个值,这将导致INSERT而不是UPDATE

要使其100%工作,只需SELECT需要PropertyData从db(即使是id,就像你正在尝试,设置它,然后坚持PropertyValuesData

最新更新