【问题标题】:Records saving multiple times记录保存多次
【发布时间】:2016-11-23 07:24:42
【问题描述】:

我正在尝试将记录保存在数据库中,保存成功,但是当我单击保存按钮时,每次都将记录保存在表中。我的意思是一条记录保存了多次。

 public void saveEmployeeDetails(Employee employeeDetails){

   try{
       System.out.println("----saveEmployeeDetails----");          

       getSession().saveOrUpdate(employeeDetails);

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

我只想保存一次。我的代码有什么问题?

java类

public class Employee { 
private long id;
private String empid;
private String empname; 

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getEmpid() {
    return empid;
}
public void setEmpid(String empid) {
    this.empid = empid;
}
public String getEmpname() {
    return empname;
}
public void setEmpname(String empname) {
    this.empname = empname;
}   
}

hbm 文件

<hibernate-mapping>
<class name="org.hibernatejavaapp.Employee" table="EMP_DETAILS">
    <id name="id" type="long">
        <generator class="native"></generator>
    </id>
    <property name="empid" column="EMPID" type="string" length="255" not-null="true" />
    <property name="empname" column="EMPNAME" type="string" length="255" not-null="true" />     
</class>
</hibernate-mapping>

【问题讨论】:

  • 你能分享你的 Employee 类吗,看起来它的主键每次保存都会改变。
  • 您的问题不清楚,无法提供答案。请阅读stackoverflow.com/help/how-to-ask
  • 在数据库中具有相同的 id
  • 向我们展示您的交易代码

标签: java hibernate


【解决方案1】:

Hibernate 使用实体的id 来表示对象相等性。在您的情况下,相同的对象被保存但不同的是id. 如果您想防止您的问题在您的数据库中重复条目。请覆盖@实体类中的 987654323@ 和 hashcode() 方法。这里您使用的是saveUpdate(),因此它根据标识符是否存在调用save()update()。例如,如果标识符存在,将调用 update(),否则将调用 save()

这是我基于您的问题的假设,如果这不是问题,请发布您的完整代码。

【讨论】:

    【解决方案2】:

    从您的问题来看,您应该将 empId 作为主键。当您的数据模式没有任何业务键时,应使用代理键。 如果您这样做,那么对于给定的员工,休眠将不会为给定的员工插入多条记录。

    对于给定的员工,您的 id 每次都会发生变化,这会导致多次插入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2010-11-02
      • 2015-12-11
      • 1970-01-01
      相关资源
      最近更新 更多