你的位置:首页 > Java教程

[Java教程]hibernate学习笔记(二)


一.昨天看hibernate时候写了一个小demo,一个junit,等着出现绿色的时候却出现了红色,这是什么情况,仔细一看出现了一个这样的错误:

caused by:java.sql.SQLException:could not retrieve transation read-only status server

Caused by: java.sql.SQLException: Unknown system variable 'tx_read_only'

一看是只有只读服务还以为配置出错了,赶紧看配置文件,但是都没什么问题,但是一直就是这样的错误,不知道怎么办的情况下去找度娘聊聊,

度娘这样说的,可能是连接数据库的驱动包的版本问题,刚好电脑上有好几个版本的驱动包,就换了一个试试,然后就成功的出现了其他问题,等下再说,至少没有出现上面的问题了,

因为是用手机上网查的,所以就没有看那么多,今天继续查了一下,其他人也有遇到这样问题的,也有其他的办法,转载一个看看,如下:

转自:http://blog.csdn.net/haohaohao000111/article/details/9242539

文章太长,主要方法有:

1>把mysql的数据库方言由 org.hibernate.dialect.MySQLDialect 改成 org.hibernate.dialect.MySQL5InnoDBDialect

2>hibernate指定数据库编码:

 

  1. <property name="connection.url">jdbc:mysql://127.0.0.1:3306/test</property>    
  2. 或者      
  3. <property name="connection.characterEncoding">UTF8</property>    

反正我这样做,提示connection没有characterEncoding属性

3>数据库连接url指定字符串:"jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8

这样指定后,配置文件不通过,提示:The reference to entity "characterEncoding" must end with the ';' delimiter.

&amp;最终:

  1. jdbc:mysql://127.0.0.1:3306/test?<span >useUnicode=true<span >&amp;</span>characterEncoding=utf8</span>  

最后一种方法解决了问题。

以前遇到过保存数据出现乱码,最后通过url指定字符串解决问题,不过就是在hibernate配置文件中从没指定过字符串。

2.上面说到解决了第一个问题,但是出现了第二个问题,是什么呢?如下:

org.hibernate.TransactionException:nested transactions not supported

继续跟度娘聊天以后知道是事务重复开启了,但是至今没有搞明白是什么情况,但是问题解决了。不废话,贴代码:

public class StudentTest {

    private SessionFactory sessionFactory=SessionFactoryUtil.getSessionFactory();
    private Session session;
    //private  Transaction tx;
    
    @Before
    public void setUp() throws Exception {
        
        session=sessionFactory.openSession();
        session.getTransaction().begin();
    }

    @After
    public void tearDown() throws Exception {
        session.getTransaction().commit();
        session.close();
    }

    @Test
    public void test() {
        Student s=new Student();
        s.setName("张三");
        session.save(s);
    }

}如上的代码可以运行正确,主要问题就出在 session.getTransaction().begin();这里,如果换成

//private  Transaction tx;

tx.beginTransaction();

tx.commit();

也可以运行正常,但是,如果换成session.beginTransaction(),其他不变就出现重复开启事务的异常。

session.beginTransaction()是开启事务,其他地方也没有开始事务啊,session.getTransaction().commit();是提交事务。

这两个没有搞明白,session.beginTransaction()和session.getTransaction()一个是直接开启事务,一个是获得事务,没什么冲突的啊?

有没有大神解释下?以后写的时候就直接加上Transaction tx,这样就不会出错了吧。