Code Bye

Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?

 

求大神讲解下
Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?

public class Main {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Student student = new Student();
student.setAge(11);
student.setName(“save”);
student.setSex(“男”);
student.setAcademicYear(“99999”);
Session session = sessionFactory.getCurrentSession();
Transaction ts = session.beginTransaction();
session.save(student);
}
}
貌似明白了   只要打印出 sql语句就 执行到数据库了?
Hibernate: insert into student (_name, _age, _sex, _academicYear, _id) values (?, ?, ?, ?, ?)

我把student.hbm.xml  中的
<id name=”id” column=”_id”>
            <generator class=”native”/>
</id>改为
<id name=”id” column=”_id”>
</id>后
再测试  只save()不commit()就不会对数据库 操作了 

1分
不配置主键生成策略会报错吧???
1分
大家顶起来了啊
一直理解<generator class=”native”/>只是主键生成策略,为了便于移植底层数据库才用native的吗?怎么会和事务有关系
需要测试下
不会报错呀    我怎么在你留言上回复?
1分
你是getCurrentSession的话自动提交
但是你后面说的那种情况很奇怪,照理说和主键木有关系啊
等大神解释
我测试下 getCurrentSession 改成openSession 试试  谢谢
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Student student = new Student();
student.setAge(11);
student.setName(“save”);
student.setSex(“男”);
student.setAcademicYear(“99999”);
//Session session = sessionFactory.getCurrentSession();
Session session = sessionFactory.openSession();
Transaction ts = session.beginTransaction();
//Student student2 = (Student)session.load(Student.class, 1);
//System.out.println(student2.getName());
session.save(student);
//ts.commit();
}

貌似不行
_id  _name  _age  _sex  _academicYear  
  1   save    11    男   99999 
还是有数据

1分
Hibernate都到4了,是该学习了
1分
我前几天用4.1.8  session不是你这样取的啊!
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Event theEvent = new Event();
        theEvent.setTitle(title);
        theEvent.setDate(theDate);
        session.save(theEvent);

        session.getTransaction().commit();
4.1.8 final  文档里就是上面的写法啊  
怎么在用户的留言回复呀

1分
去试试了,
43分
你会结贴不呢?

原因是数据源conn默认的提交方式,hibernate封装的jdbc,因为jdbc默认是的conn提交方式是true 
这样 就应该不能提交了 

public static void main(String[] args) throws Exception {     
    SessionFactory sf=HibernateSessionFactory.getSessionFactory();     
    Session session=sf.openSession();     
    System.out.println(session.connection().getAutoCommit());     
    session.connection().setAutoCommit(false);     
    User u=new User();     
    u.setName("aaa");     
    session.save(u); 
} 
1分
hibernate4 好像变动很大、

要看你hibernate文件是如何配置事务的、

getCurrentSession();这样获取的session是就可以不用手动关闭了、

其实跟session有关、

我的猜测是 getCurrentSession() 获取到了你配置的事务、
最后将数据库flush到了数据库中、

以上也都是个人猜测而已、没有看hibernate4的源码、只晓得hibernate4相比hibernate3变动挺大的

该结贴 了

总结下  测试的程序

SessionFactory sessionFactory = HibernateUtil.getAnnotationSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction ts = session.beginTransaction();
Husband h1 = new Husband();
h1.setName(“w1”);
Wife w1 = new Wife();
w1.setName(“ll”);
h1.setMyWife(w1);
session.save(w1);
session.save(h1);
                //session.clear() 在这调用 clear()commit后数据库有内容说明save 自动提交了 
w1.setName(“wwww”);
w1.setName(“qqq”);
               //session.clear() 在这里调用clear()不会访问数据库 缓存清空了
try{
ts.commit();
}catch(Exception e){
System.out.println(“回滚”);
ts.rollback();
}

还有 我用了Annotation后  只save()不commit() 数据库里没有内容。用xml会有内容  可能是   scottxzj 说的吧   我在试试结贴   

session.connection()   在  4.1.8 中已废除了  郁闷
失误  没有结贴     测试 失败!
try {
System.out.println(session.connection().getAutoCommit());
session.connection().setAutoCommit(false);
} catch (HibernateException e1) {
e1.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
测试结果
false
Hibernate: 
    insert 
    into
        Wife
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        Husband
        (myWife_id, name) 
    values
        (?, ?)
我想知道SSH中是怎么管理事物的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?