hibernate中的更新方法不会替换旧数据但会创建一个新数据吗?

时间:2016-04-16 01:31:49

标签: java hibernate

以下是我的简单代码,将一些代码保存在XML文件中。

<?xml version='1.0' encoding='utf-8'?>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop the existing tables and create new one -->
    <property name="hbm2ddl.auto">update</property>

    <!-- Mention here all the model classes along with their package name -->

    <mapping class="com.hibernate.Student"/>

</session-factory>

这是我的学生班,

package com.hibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="STUDENT")
public class Student {

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int rollNo;

@Column(name="FULL_NAME",nullable=false)
private String name;

public int getRollNo() {
    return rollNo;
}
public void setRollNo(int rollNo) {
    this.rollNo = rollNo;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}

主要:

package com.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Main {
    public static void main(String[] args){
        Student student= new Student();
        student.setName("Chang");
        SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();
        Session session=sessionFactory.openSession();
        session.beginTransaction();

        //session.save(student);

        //get a student from the databse
        student=(Student)session.get(Student.class, 1);
        System.out.println("Student Object have student name as:"+student.getName());

        student.setName("Chang_update");
        session.update(student);

        session.getTransaction().commit();
        session.close();
        //sessionFactory.close();       
    }
}

首先,我想创建一个新表并插入一个新学生。所以我放了<property name="hbm2ddl.auto">create</property>。我有session.save(student);我没有这部分代码:

student=(Student)session.get(Student.class, 1);
System.out.println("Student Object have student name as:"+student.getName());

student.setName("Chang_update");
session.update(student);

然后我想测试get和update方法。所以我更改了<property name="hbm2ddl.auto">update</property>,删除了session.save(student);并添加了

student=(Student)session.get(Student.class, 1);
System.out.println("Student Object have student name as:"+student.getName());

student.setName("Chang_update");
session.update(student);

然后我运行代码。 get方法适用于返回Chang。但对于更新方法,我认为它将取代旧数据。但它出现了一个名为Chang_update的新学生,RollNo为1.老张的Roll没有成为2.

我是新来的冬眠,你能不能给我一个暗示这里发生了什么?

1 个答案:

答案 0 :(得分:0)

不要认为这是问题所在,但是你应该确定一个@Version列,以便Hibernate能够正确地进行并发管理。

带有GenerationType.AUTO的@Id让Hibernate管理PK。因为id字段是int(primitive)与Integer(可以为null),所以总有一个值,甚至是零。因此,不要认为hibernate可以判断这是否是新行,并且每次都需要创建一个新行,并且无论出于什么原因,都知道已经有PK为1并且更新了另一个? / p>

不完全熟悉AUTO,但我建议将id字段更改为Integer,并可能使用序列对象生成。