Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-将对象保存在一起_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

Java JPA-将对象保存在一起

Java JPA-将对象保存在一起,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我有一个实体(javax.persistence)对象,它有三个字段-A、B和deleted。组合(A、B、已删除)应是唯一的。我使用true/null作为deleted的值,以便惟一约束在MySQL中保持有效 假设我在数据库中已经有一条记录(1,a1,b1,true)。现在,我尝试将该记录的deleted更新为null,同时插入一个新对象(2,a1,b1,true)。因此,我的表将事务的结尾视为(1,a1,b1,null),(2,a1,b1,true)。但是,此代码因唯一约束冲突而失败。我将此

我有一个实体(javax.persistence)对象,它有三个字段-A、B和deleted。组合(A、B、已删除)应是唯一的。我使用true/null作为deleted的值,以便惟一约束在MySQL中保持有效

假设我在数据库中已经有一条记录(1,a1,b1,true)。现在,我尝试将该记录的deleted更新为null,同时插入一个新对象(2,a1,b1,true)。因此,我的表将事务的结尾视为(1,a1,b1,null),(2,a1,b1,true)。但是,此代码因唯一约束冲突而失败。我将此理解为预期行为,因为在提交事务之前,现有记录将触发冲突异常

有没有什么方法可以做我想做的事情而不抛出异常

伪代码:

整个过程都在一个标记为Transactional的方法中

dbObj=repo.find(..)//返回(1,a1,b1,true)
newObj=copyFrom(dbObj)//创建另一个(a1,b1,true)
dbObj.setValid(null)
回购保存(dbObj)
回购保存(newObj)

我建议您按照下面的伪代码中的步骤来实现这一点

1) 将有效指示符列值的默认值定义为false

private void saveObject(){
  dbObj = repo.find(..) 
  EntityManager em = emf.createEntityManager();
  EntityTransaction tx = em.getTransaction();
  dbObj.setValid(false);
  tx.persist(dbObj);
  em.flush();

  newObj(a1,b1,true);
  tx.persist(newObj);
  em.flush();

tx.commit();
}

您可以通过执行查询并使用一些代码进行更新来检查给定记录是否存在。我知道有一个现有的记录。我正在尝试将其标记为已删除,并为关键列a和B创建一个具有相同值的新对象(业务原因)。在保存新对象之前,请调用
entityManager.flush()
。或者延迟唯一约束,即仅在提交时检查(如果MySQL支持延迟约束)。请注意,对托管实体调用save()是无用的。托管对象状态将自动保存。您应该在两个单独的事务中进行修改