我正在尝试将数据插入到包含(NAME,VALUE)列
的表格中EntityManager.persist()。
当我坚持像(' xx',' value1')这样的实体时,它会在该表中为该实体插入一条新记录。但是,如果我想要保留一个新实体,例如(' 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.
答案 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(),通常这解决了问题