以下是我的简单代码,将一些代码保存在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.
我是新来的冬眠,你能不能给我一个暗示这里发生了什么?
答案 0 :(得分:0)
不要认为这是问题所在,但是你应该确定一个@Version列,以便Hibernate能够正确地进行并发管理。
带有GenerationType.AUTO的@Id让Hibernate管理PK。因为id字段是int(primitive)与Integer(可以为null),所以总有一个值,甚至是零。因此,不要认为hibernate可以判断这是否是新行,并且每次都需要创建一个新行,并且无论出于什么原因,都知道已经有PK为1并且更新了另一个? / p>
不完全熟悉AUTO,但我建议将id字段更改为Integer,并可能使用序列对象生成。