初学Hibernate的几个问题

ailling 2004-12-28 12:20:18
本来在tomcat下作了一个测试hibernate的例子,但是测试一直有错

后来就自己做了一个单独类测试来测试hibernate
问题1:我们知道 .jar .war .ear组成的应用程序在j2ee服务器上(包括tomcat)部署的时候会自动装载web-inf\lib下的资源包, 就拿hibernate例子来说,要运行hibernate就必须把所有hibernate必须的jar包拷贝到lib目录里, 那么当程序脱离j2ee服务器的时候,要运行Hibernate是不是必须把这些需要的jar文件添加到系统的CLASSPATH里,或者自己修改类装载器来装载需要的包(这个是应该能实现吧)

问题2:就是我们例子中遇到的问题
数据库使用的是sqlserver2000
目录组织是:

hibernate.cfg.xml
test\---student.class
---student_hbm.xml
---testStudent.class

hibernate.cfg.xml内容如下
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.connection.driver_class">sun.jdbc.odbc.JdbcOdbcDriver</property>
<property name="hibernate.connection.url">jdbc:odbc:school</property>
<property name="hibernate.connection.username">java</property>
<property name="hibernate.connection.password">12345678</property>
<property name="hibernate.connection.pool.size">0</property>

<mapping resource="test/Student_hbm.xml"/>

</session-factory>

</hibernate-configuration>


student_hbm.xml内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>

<class name="test.Student" table="student">
<id name="userid" type="java.lang.String" column="userid" >
<generatorclass="net.sf.hibernate.id.TableHiLoGenerator" />
</id>
<property name="username" />
</class>

</hibernate-mapping>


student.java内容如下

package test;
import java.util.*;
import java.sql.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class Student {
private String userid = "";
private String username = "";
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserid() {
return userid;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public boolean selectHBM() throws Exception {


Session session = HibernateUtil.currentSession();
try {
String queryString = "select test.Student from test.Student as stu where stu.userid='"+userid+"'";
Query query = session.createQuery(queryString);
Iterator it = query.iterate();
if(it.hasNext()){
Student stu=(Student)it.next();
username = stu.getUsername();
return true;
}else{
return false;
}


} catch (Exception he) {
throw new Exception(he);
} finally {
HibernateUtil.closeSession();
}
}
}


HibernateUtil.java类为:
package test;
import java.io.InputStream;
import java.util.Properties;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);
}
}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession() 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();
}
}



package test;
public class testStudent {
public static void main(String args[]){
Student student=new Student();
student.setUserid("test1");
student.setUsername("wangzn");
try{
boolean isValid=student.selectHBM();
System.out.println(""+isValid);
}catch(Exception e){System.out.println(e);}

}
}

运行testStudent

C:\testHib\classes>java school.testStudent
2004-12-28 11:23:14 net.sf.hibernate.cfg.Environment <clinit>
信息: Hibernate 2.1 beta 1
2004-12-28 11:23:14 net.sf.hibernate.cfg.Environment <clinit>
信息: hibernate.properties not found
2004-12-28 11:23:14 net.sf.hibernate.cfg.Environment <clinit>
信息: using CGLIB reflection optimizer
2004-12-28 11:23:14 net.sf.hibernate.cfg.Environment <clinit>
信息: JVM proxy support: true
2004-12-28 11:23:14 net.sf.hibernate.cfg.Configuration getConfigurationInputStre
am
信息: Configuration resource: /hibernate.cfg.xml
2004-12-28 11:23:15 net.sf.hibernate.util.XMLHelper$ErrorLogger error
服务器: Error parsing XML: /hibernate.cfg.xml(1)
org.xml.sax.SAXParseException: 字符转换错误:“Malformed UTF-8 char -- is an XML
encoding declaration missing?”(行号可能太小)。
at org.apache.crimson.parser.InputEntity.fatal(InputEntity.java:1100)
at org.apache.crimson.parser.InputEntity.fillbuf(InputEntity.java:1072)
at org.apache.crimson.parser.InputEntity.isXmlDeclOrTextDeclPrefix(Input
Entity.java:914)
at org.apache.crimson.parser.Parser2.maybeXmlDecl(Parser2.java:1009)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:486)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)

at org.dom4j.io.SAXReader.read(SAXReader.java:339)
at net.sf.hibernate.cfg.Configuration.configure(Configuration.java:805)
at net.sf.hibernate.cfg.Configuration.configure(Configuration.java:752)
at net.sf.hibernate.cfg.Configuration.configure(Configuration.java:739)
at school.HibernateUtil.<clinit>(hibernateutil.java:26)
at school.test.selectHBM(student.java:262)
at school.testStudent.main(teststudent.java:32)

这是什么问题啊,解析xml出错,可是看不出错误啊
...全文
107 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
孙亖 2004-12-28
  • 打赏
  • 举报
回复
gz
bzg520 2004-12-28
  • 打赏
  • 举报
回复
一个给新手学习和讨论JAVA的群8004940 欢迎广大JAVA爱好者加入此群,不论你是JAVA初学者,还是即将开始学习JAVA的,只要你热爱JAVA 那么就别犹豫了加入此群让我们共同进步,也强烈欢迎愿意帮助并指点新人的高手进入,所有热爱JAVA的人都将十分感激您的帮助
ailling 2004-12-28
  • 打赏
  • 举报
回复
问题找到了,确实是xml文件格式不对
还有个问题,我使用的是sqlserver服务器
所以有
<property name="hibernate.dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
但是执行的时候提示

信息: building session factory
2004-12-28 15:21:19 net.sf.hibernate.cfg.SettingsFactory buildSettings
警告: No dialect set - using GenericDialect: Dialect class not found: net.sf.hib
ernate.dialect.SQLServerDialect
2004-12-28 15:21:19 net.sf.hibernate.dialect.Dialect <init>
信息: Using dialect: net.sf.hibernate.dialect.GenericDialect

为什么呢,net.sf.hibernate.dialect.SQLServerDialect这个类确实存在啊,
我使用其他类名就可以 例如MySQLDialect

另外一个问题就是:
能够使用hibernate执行查找操作
但是不能执行插入操作
Session session = HibernateUtil.currentSession();
Transaction transaction;
try {
transaction = session.beginTransaction();
Student s=new Student();
s.setUserid("001");
s.setUsername("test4");
s.setSex("man");
s.setPhone("phone1");
s.setAddress("add1");

session.save(s);
transaction.commit();

} catch (Exception he) {
throw new Exception(he);
} finally {
HibernateUtil.closeSession();
}

执行的时候提示
2004-12-28 15:21:20 net.sf.hibernate.JDBCException <init>
服务器: Could not save object
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]第 1 行: F
OR UPDATE 子句仅允许用于 DECLARE CURSOR。
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6106)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:6263)
at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:2564)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedState
ment.java:214)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(JdbcOdbcPrepared
Statement.java:89)
at net.sf.hibernate.id.TableGenerator.generate(TableGenerator.java:93)
at net.sf.hibernate.id.TableHiLoGenerator.generate(TableHiLoGenerator.ja
va:59)
at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:634)
at school.testStudent.insertHBM(testStudent.java:59)
at school.testStudent.main(testStudent.java:28)

这是什么问题呢,是不是因为<property name="hibernate.dialect">配置不成功?
programeyonger 2004-12-28
  • 打赏
  • 举报
回复
请检查你的hibernate.cfg.xml文件的格式!!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧