在hibernate官方网站有相关配置方法,搜索关键字jboss
1. 首先创建一个java工程
2. 添加hibernate功能(本工程已添加)
3. 采用jndi数据源,将hibernate.cfg.xml配置如下:(采用了oracle数据库)
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="myeclipse.connection.profile">infotest</property>
<property name="connection.url">
jdbc:oracle:thin:@203.134.243.46:1521:infotest
</property>
<property name="connection.username">vote</property>
<property name="connection.password">hc360</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="transaction.factory_class"><!—采用了jdbc而非jta-->
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="transaction.manager_lookup_class">
org.hibernate.transaction.JBossTransactionManagerLookup
</property>
<property name="session_factory_name">
java:/hibernate/SessionFactory
</property>
<property name="transaction.flush_before_completion">true</property>
<property name="transaction.auto_close_session">true</property>
<property name="jta.UserTransaction">java:comp/UserTransaction</property>
<mapping resource="com/tryJndi/pojo/Message.hbm.xml" />
</session-factory>
</hibernate-configuration>
或者
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="connection.username">vote</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.datasource">java:OracleDS</property>
<property name="connection.password">hc360</property>
<property name="transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="session_factory_name">
java:/hibernate/SessionFactory
</property>
<property name="transaction.manager_lookup_class">
org.hibernate.transaction.JBossTransactionManagerLookup
</property>
<property name="current_session_context_class">jta</property>
<property name="transaction.auto_close_session">true</property>
<mapping resource="com/hj/pojo/Message.hbm.xml" />
</session-factory>
</hibernate-configuration>
4. 配置hibernate-service.xml文件(又有人说是jboss-service.xml),根据使用时具体情况确定吧!比较重要的参数已经加粗。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ===================================================================== -->
<!-- -->
<!-- Sample TreeCache Service Configuration -->
<!-- Recommended for use as Hibernate's 2nd Level Cache -->
<!-- For use with JBossCache >= 1.3.0 ONLY!!! -->
<!-- -->
<!-- ===================================================================== -->
<server>
<mbean code="org.hibernate.jmx.HibernateService" name="jboss.jca:service=hibernateJndi.har,
name=hibernateJndi">
<depends>jboss.jca:service=RARDeployer</depends>
<depends>jboss.jca:service=LocalTxCM,name=OracleDS</depends>
<!-- Make it deploy ONLY after D.hbm.xml, XXX SOMETHING IS MISSING HERE, PLEASE FIX !! XXX-->
<attribute name="MapResources">com/hj/pojo/Message.hbm.xml</attribute>
<attribute name="JndiName">java:/hibernate/SessionFactory</attribute>
<attribute name="Datasource">java:OracleDS</attribute>
<attribute name="Dialect">org.hibernate.dialect.Oracle9Dialect</attribute>
<attribute name="CacheProviderClass">org.hibernate.cache.HashtableCacheProvider</attribute>
<attribute name="TransactionStrategy">org.hibernate.transaction.JTATransactionFactory</attribute>
<attribute name="TransactionManagerLookupStrategy">org.hibernate.transaction.JBossTransactionManagerLookup
</attribute>
<property name="hibernate.current_session_context_class">jta</property>
<attribute name="UserTransactionName">java:comp/UserTransaction</attribute>
</mbean>
</server>
5. 在图形化界面产生JNDI DAO相关的类
6. 在jboss的deploy目录(all,default,minimal应该都可以,这次使用的是all目录) 创建一个hibernateJndi.har目录,在该目录下创建META-INF目录并将工程的jar包解压到hibernateJndi.har目录。注意该工程只包括hibernate相关的类和映射文件。另外sessionFactory的名称也必须各工程不一样,以免发生错误。
7. 将相关的包放在all目录的lib下,
8. 最好使用新版本的jboss,并且尽可能不要改变jboss和工程中的版本,否则有可能产生版本不一致的问题。
9. 在all\deploy\jboss-web.deploy目录下创建testJndi.jsp文件对jndi和事务做相关测试。testJndi.jsp内容如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@page import="java.sql.*"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.*"%>
<%@page import="org.hibernate.Session"%>
<%@page import="org.hibernate.SessionFactory"%>
<%@page import="org.hibernate.cfg.Configuration"%>
<%@page import="com.hj.pojo.MessageDAO"%>
<%@page import="com.hj.pojo.Message"%>
<%@page import="javax.transaction.UserTransaction"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
//jndi数据源测试
try{
Context initCtx=new InitialContext();
DataSource db = (DataSource)initCtx.lookup("java:OracleDS");
Connection conn = db.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM message");
out.println("User-list"+"<br>");
while(rs.next()){
out.print(rs.getString("content")+" ");
out.print(rs.getString("topic")+"<br>"); }
rs.close();
stmt.close();
conn.close();
}catch(Exception e){
out.print(e);
}
//sessionFactory测试
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
org.hibernate.SessionFactory factory = (org.hibernate.SessionFactory)ctx.lookup("java:/hibernate/SessionFactory"); //之前配置的sessionFactory的名字
org.hibernate.Session se = factory.openSession();
org.hibernate.Query query=se.createQuery("from com.hj.pojo.Message");
java.util.List results=query.list();
java.util.ListIterator iterator=results.listIterator();
if(iterator.hasNext()){
com.hj.pojo.Message user=(com.hj.pojo.Message)iterator.next();
out.print("Login success");
}
se.close();
//测试transaction
out.println("Now begin to insert data...");
com.hj.pojo.Message user = new com.hj.pojo.Message();
user.setChildNum(new Long(20));
user.setContent("just for test");
user.setCreateTime(java.util.Timer.class.toString());
user.setRootId(new Long(1));
user.setTopic("test by cao");
user.setUserId(new Long(2));
javax.transaction.UserTransaction utx =(javax.transaction.UserTransaction)
ctx.lookup("java:comp/UserTransaction");
utx.begin();
com.hj.pojo.MessageDAO messageDao=new com.hj.pojo.MessageDAO();
messageDao.save(user);
utx.commit();
%>
</body>
</html>
10.整个的思路就是分层的思路,将hibernate,spring,web层分离,产生不同的包。
一.Jboss5配置jndi数据源
1. 把docs/examples/jca/oracle-ds.xml文件复制到/server/default/deploy目录下,改一下oracle-ds.xml.
2.修改standardjaws.xml 或jaws.xml配置文件,并把<datasource>和<type-mapping>元素这只为下面这样:
<jaws>
<datasource>java:/OracleDS</datasource>
<type-mapping>Oracle 9i</type-mapping>
</jaws>
3.修改standardjbosscmp-jdbc.xml 或 jbosscmp-jdbc.xml配置文件,置<datasource>
和 <datasource-mapping>
元素使用Oracle :
<datasource-mapping>
<defaults>
<datasource>java:/OracleDS</datasource>
<datasource-mapping>Oracle 9i</datasource-mapping>
</defaults>
</datasource-mapping>
4.最后我们需要修改login-config.xml文件来使用Oracle,下面是login-config.xml文件的<application-policy>元素:
<application-policy name = "OracleDbRealm">
<authentication>
<login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
flag = "required">
<module-option name = "principal">scott</module-option>
<module-option name = "userName">scott</module-option>
<module-option name = "password">tiger</module-option>
<module-option name ="managedConnectionFactoryName">
jboss.jca:service=LocalTxCM,name=OracleDS
</module-option>
</login-module>
</authentication>
</application-policy>
//测试代码:
<%
Context initialContext = new InitialContext();
DataSource ds = (DataSource) initialContext.lookup("java:/OracleDS");
java.sql.Connection conn = null;
try {
conn = ds.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(" select t.id,t.name from stu t where t.age=21 ");
while(rs.next()) {
System.out.println("name is "+rs.getString("name"));
out.print("name is "+rs.getString("name"));
out.print("<br>");
}
} finally {
if(conn!=null) {
conn.close();
}
}
//while(rs.)
%>