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()保存它 否则,更新()对象

对于您的方法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()保存它 否则,更新()对象

在将tesplanDetails添加/设置到testPlan检查之前,每个testPlanDetail实体的主键不是0。在将tesplanDetails添加/设置到testPlan检查之前,每个TestPlanDetails实体的主键不是0。我没有得到任何例外您可以在
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();
}