Java Hibernate saveOrUpdate不更新,而是创建新记录
我有两个映射为双向的表,如下所示Java Hibernate saveOrUpdate不更新,而是创建新记录,java,hibernate,Java,Hibernate,我有两个映射为双向的表,如下所示 @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=Cascade
@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
}
我面临的问题是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();
}
在执行查询之前不应关闭会话,因此您将获得SessionException,但不是预期的testPlan
,并休眠保存未持久化实体
从中,您可以发现saveOrUpdate()
执行以下操作:
- 如果对象在此会话中已持久化,则不执行任何操作
- 如果与会话关联的另一个对象具有相同的 标识符,引发异常
- 如果对象没有标识符属性,则保存它()
- 如果对象的标识符的值已分配给新的 实例化对象,保存()它
- 如果对象由or进行版本控制,则返回version属性值 是否为新实例化的对象指定了相同的值save()保存它 否则,更新()对象
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();
}
在执行查询之前不应关闭会话,因此您将获得SessionException,但不是预期的testPlan
,并休眠保存未持久化实体
从中,您可以发现saveOrUpdate()
执行以下操作:
- 如果对象在此会话中已持久化,则不执行任何操作
- 如果与会话关联的另一个对象具有相同的 标识符,引发异常
- 如果对象没有标识符属性,则保存它()
- 如果对象的标识符的值已分配给新的 实例化对象,保存()它
- 如果对象由or进行版本控制,则返回version属性值 是否为新实例化的对象指定了相同的值save()保存它 否则,更新()对象
updateTestPlan
中打印tp
?让我们看看测试计划id是否存在。我没有得到任何例外。您可以在updateTestPlan
中打印tp
?让我们看看testplan\u id是否存在。
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();
}