一.昨天看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指定数据库编码:
反正我这样做,提示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.
xml对于特殊的字符要转义: & ---->&最终:
最后一种方法解决了问题。
以前遇到过保存数据出现乱码,最后通过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,这样就不会出错了吧。