JPA插入对象如果不存在,则不插入,如果存在则不做任何事情。

4
@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,那么我可以保存新属性,但对于现有属性,它会尝试再次插入。为避免再次插入相同的属性,我应该怎么做?

请添加几行代码,展示您如何将实体写入数据库/实体管理器。 - Guenther
1个回答

2
尝试添加额外的CascadeType.MERGE
此外,记住PropertyData需要被管理(即在当前持久化上下文中而不是分离状态),才能使其工作。如果您使用分离实体,请将其id设置为数据库中的某些内容,否则可能导致INSERT而非UPDATE。
要使其完全正常运行,只需从数据库中选择所需的PropertyData(甚至可以按id这样尝试),设置它,然后持久化PropertyValuesData。

@lucas999,请检查一下提醒。你肯定是在使用分离的实体。 - Antoniossss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接