如何强制EntityManager.persist()只进行插入而不是更新

时间:2017-04-11 13:29:53

标签: java hibernate jpa

我正在尝试将数据插入到包含(NAME,VALUE)

的表格中
  

EntityManager.persist()。

当我坚持像(' xx',' value1')这样的实体时,它会在该表中为该实体插入一条新记录。但是,如果我想要保留一个新实体,例如(' xx',' value2'),则该实体将保留在已存在记录的位置。

问题是:

  • 为什么以及如何发生?
  • 是否有办法插入(' xx',' value2')?

我发现了一个类似的问题here,但这个问题没有真正的答案。

非常感谢。

更新:第一列不是主键。相反,第二个是。

这是实体:

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

    @Column(name = "NAME", nullable = false)
    private String name;

    @Id
    @Column(name = "VALUE", nullable = false)
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

以下是持久代码:

@Transactional
public static void storeTestData(EntityManager em, String name, String value) {
    TestDataEntity entity = new TestDataEntity();
    entity.setName(name);
    entity.setValue(value);

    em.persist(entity);
}

此外,还有另一个问题,即here.

2 个答案:

答案 0 :(得分:1)

问题以这种方式解决:

@Transactional
public static void storeTestData(EntityManager em, String name, String value) {
    EntityTransaction transaction = em.getTransaction();

    try {
        transaction.begin();

        TestDataEntity entity = new TestDataEntity();
        entity.setName(name);
        entity.setValue(value);

        em.persist(entity);

        transaction.commit();
    } catch (RuntimeException re) {
        if (transaction != null && transaction.isActive())  {
            transaction.rollback();
        }

        throw re;
    }

这意味着,如果没有提供显式事务,那么如果现有记录的任何值与实体对象中的相应字段值匹配,则会更新现有记录。

恕我直言,这真的很奇怪而且并不简单,因为它会更好,如果它会抛出

javax.persistence.TransactionRequiredException

就像更新/删除语句一样。

答案 1 :(得分:0)

检查你的实体是否正确实现了equals()和hashCode(),通常这解决了问题