首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

乖乖,hibernate 居然会这么?Why

2011-11-24 
乖乖,hibernate 居然会这样??Why?1。表名:tUser1CREATETABLE[dbo].[tUser1]([uid][int]NOTNULL,[username][

乖乖,hibernate 居然会这样??Why?
1。表名:tUser1
              CREATE   TABLE   [dbo].[tUser1]   (
[uid]   [int]   NOT   NULL   ,
[username]   [varchar]   (255)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[password]   [varchar]   (255)   COLLATE   Chinese_PRC_CI_AS   NULL  
)   ON   [PRIMARY]
GO

2。User.hbm.xml
    <?xml   version= "1.0 "   encoding= "UTF-8 "?>
<!DOCTYPE   hibernate-mapping   PUBLIC
                    "-//Hibernate/Hibernate   Mapping   DTD   3.0//EN "
                    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd ">
<hibernate-mapping>
<class   name= "com.hibernate.User "   table= "tUser1 ">
  <id   name= "uid "   column= "uid "   type= "java.lang.Integer ">  
    <generator   class= "increment "/>
  </id>
      <property   name= "username "/>
    <property   name= "password "/>
  </class>
  </hibernate-mapping>

3.class:         HibernateUtil

package   com.hibernate;

import   org.hibernate.HibernateException;
import   org.hibernate.Session;
import   org.hibernate.SessionFactory;
import   org.hibernate.cfg.Configuration;

public   class   HibernateUtil   {
private   static   final   SessionFactory   sessionFactory;
static{
try{
sessionFactory=new   Configuration().configure().buildSessionFactory();

}catch(Throwable   ex){
throw   new   ExceptionInInitializerError(ex);

}

}
public   static   final   ThreadLocal   session=new   ThreadLocal();

public   static   SessioncurrentSession()throws   HibernateException{
Session   s=(Session)session.get();
if(s==null){
s=sessionFactory.openSession();
session.set(s);
}
return   s;
}

public   static   void   closeSession()throws   HibernateException{
Session   s=(Session)session.get();
session.set(   null);
if(s!=null){
s.close();

}
}

}

4   测试类   test.java
import   org.hibernate.HibernateException;
import   org.hibernate.Session;
import   org.hibernate.Transaction;

public   class   Test   {
public   static   void   main(String   args[]){
try{

Session   session=HibernateUtil.currentSession();
Transaction   tx=session.beginTransaction();

User   user=new   User();
user.setUsername( "中国 ");
user.setPassword( "123 ");
session.save(user);
tx.commit();
session.close();
}catch(HibernateException   e){
e.printStackTrace();

}

}

}

问题:表   tUser1中原来有几条数据,运行test.java   可以将数据插入   tUser1   中,但原来的数据被删掉了。为什么呢?如果再次运行,表中还是只有一条数据
  1                           中国                                       123


运行两次的话不应该是
  1                           中国                                       123
  2                           中国                                       123
吗?

[解决办法]
ID 产生器的问题吧~~~

<generator class= "increment "/>

对数据库的依赖性比较大, 对不同的数据库会产生不同的结果.

建议换成 native , 由hibernate依据数据库来建立.
或者换成 assigned, 创建自己的ID产生器.
[解决办法]
数据库id要设位自增,之后hbm.xml的id要定义unsaved-value,一般为unsaved-value= "null ",之后运行,看看Hibernate输出的SQL.

热点排行