gpt4 book ai didi

java - Hibernate saveOrUpdate 不更新而是创建新记录

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:39 25 4
gpt4 key购买 nike

我有 2 个双向映射的表,如下

@Entity
@Table(name="testplan")
public class TestPlan {

@Id
@Column(name="testplan_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int testplan_id;
@OneToMany(mappedBy="testplan_id",cascade=CascadeType.ALL)
private List<TestPlanDetails> testPlanDetails;
//getters and setters
}

@Entity
@Table(name="TestPlanDetails")
public class TestPlanDetails {

@Id
@Column(name="testplan_details_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int testplan_details_id;



@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="testplan_id")
private TestPlan testplan_id;

// getters and setters
}

这是我的服务等级

TestPlan testPlan=testPlanDao.getTestPlan(id, testPlanVersion);
//saveGeneralInfo(rgi, testPlan);
TestPlanGeneralInfo tpgi=testPlanGeneralInfo(rgi, testPlan);



List<TestPlanDetails> testPlanDetails=getDetails(list,testPlan);
testPlan.setTestPlanDetails(testPlanDetails);
testPlanDao.updateTestPlan(testPlan);

这是我的 testplanao 方法

public TestPlan getTestPlan(int  id,String testPlanVersion )
{

String hql="from TestPlan tp where tp.id=:id and tp.testplan_version=:testPlanVersion";
Query query=currentSession().createQuery(hql);
query.setParameter("id", id);
query.setParameter("testPlanVersion", testPlanVersion);
closeSession();
return (TestPlan) query.uniqueResult();
}

@Override
public void updateTestPlan(TestPlan tp)
{
// TODO Auto-generated method stub
Session session=currentSession();
Transaction tx=null;
try{
tx=session.beginTransaction();
session.saveOrUpdate(tp);
session.flush();
session.clear();
tx.commit();
}
catch(HibernateException eq)
{
tx.rollback();
eq.printStackTrace();

}
catch(Exception e)
{
tx.rollback();
e.printStackTrace();


}
finally
{
if (session != null && session.isOpen()) {
session.close();
}
}

}

我面临的问题是 hibernate 正在子表中插入新记录。我已从 saveOrUpdate 更改为 update,但 hibernate 仍在插入新的子记录。

我做错了什么?

最佳答案

对于您的方法 getTestPlan,

public TestPlan getTestPlan(int  id,String testPlanVersion )
{

String hql="from TestPlan tp where tp.id=:id and tp.testplan_version=:testPlanVersion";
Query query=currentSession().createQuery(hql);
query.setParameter("id", id);
query.setParameter("testPlanVersion", testPlanVersion);
closeSession();
return (TestPlan) query.uniqueResult();
}

在查询执行之前不应关闭 session ,因此您会收到 SessionException 但不是预期的 testPlan,并且 Hibernate 会保存未持久化的实体。

来自this question ,您可能会发现 saveOrUpdate() 执行以下操作:

  • 如果该对象已在此 session 中持久化,则不执行任何操作
  • 如果与 session 关联的另一个对象具有相同的标识符,抛出异常
  • 如果对象没有标识符属性,则 save() 它
  • 如果对象的标识符具有分配给新对象的值实例化对象,save()它
  • 如果对象由 或 进行版本控制,并且版本属性值与分配给新实例化的对象的值相同,save() 它否则 update() 对象

关于java - Hibernate saveOrUpdate 不更新而是创建新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com