1.One Table
1.1 添加数据源
在: /jboss-4.2.2.GA/docs/examples/jca/oracle-ds.xml,拷贝oracle-ds.xml
到: /jboss-4.2.2.GA/server/all/deploy
配置内容:
<jndi-name>OracleDS</jndi-name>
<connection-url>jdbc:oracle:thin:@localhost:1521:orcl</connection-url>
...
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<user-name>scott</user-name>
<password>ffffff</password>
...
<metadata>
<type-mapping>Oracle10g</type-mapping>
</metadata>
1.2 添加驱动程序
向:/jboss-4.2.2.GA/server/all/lib下添加ojdbc14.jar(一定是Oracle10g驱动,如果是9i添加9i驱动)
1.3 建立一个EJB3.0工程
配置如下:
1.3.1 在src下添加一个文件夹META-INF,在本文件夹下添加两个文件:persistence.xml和persistence_1_0.xsd
persistence.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">
<persistence-unit name="oneTable">
<jta-data-source>java:/OracleDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<!--
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/>
-->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
</properties>
</persistence-unit>
</persistence>
--注意:必须添加hibernate.dialect方言,在10g中不添加数据库方言不会出现错误,9i就会出现错误;
--其中
<persistence-unit name="personTable">的name值必须和dao中的实现类中:@PersistenceContext(unitName="personTable")
内容一致;
java:/OracleDS:OracleDS与oracle-ds.xml中的<jndi-name>OracleDS</jndi-name>一致;
1.3.2 建立持久化类
1.3.3 添加Dao实现
注意:
操作 技术
insertUser(User user) em.persist(user);
deleteUser(User user) em.remove(em.merge(user));
getAllUser() Query query = em.createQuery(eql);
List<User> list = query.getResultList();
getUserByUserId(int userId) em.find(User.class, Integer.valueOf(userId));
updateUser(User user) em.merge(user);
关键注意删除操作,原因如下:
/**
*
* delete user:关键语法em.remove(em.merge(user));
* 注意:要删除一个对象的时候不能够直接调用em.remove()进行,必须首先进行更新在删除,这样新的session产生
* 才可以删除,因为原来的session已经关闭,无法执行remove方法,执行更新session被激活,可以进行删除;
*
* 原理解释如下:
* 原文:
* Hibernate object states有三种状态:Transient、Persistent、Detached。关于Detached,是这么说的:
* Detached - a detached instance is an object that has been persistent,
* but its Session has been closed.
* The reference to the object is still valid, of course, and the detached instance might even be modified in this state.
* A detached instance can be reattached to a new Session at a later point in time,
* making it (and all the modifications) persistent again.
* 译文:
* 一个detached instance是一个已经持久化的对象,
* 但是它的Session已经关闭了,
* 它的引用依然有效,当然,detached instance可能被修改。
* detached instance能够在以后可以重新附属到一个新的Session,使之能重新序列化。
*
* 解决方法:
* 找到解决办法了,在删除之前把这个Detached instance绑定到当前的Sesssion
* ,在用当前Sesssion删除此instance。getEntityManager()提供merge方法实现。
*
*/
1.3.4 打包发布测试
2.Many Table
2.1 共有操作如上;
2.2 多表关联,进行删除要非常注意:
/**ManyToOne或者OneToMany中删除数据比较麻烦;
* 注意:不能直接使用em.remove(Object)方法,无法删除数据,必须使用以下方法进行删除
* 1.清除em中的内容
* em.clear();
* 2.从新检索这个对象:
* office = em.find(Office.class, office.getOfficeId());
* 3.删除对象
* em.remove(office);
*
* 参考原文:
* 先通过调用EntityManager.clear();方法来把所有的对象都从context清除了.
* 然后调用System.gc();来让vm执行垃圾回收动作.
* 最后再次通过EntityManager.find()或其它方法来对要删除对象进行查询.
* 重新对查询出来的对象再执行删除动作.
*
* detete office
*/
public void deleteOffice(Office office) throws Exception {
System.out.println("-----deleteOffice");
em.clear();
office = em.find(Office.class, office.getOfficeId());
em.remove(office);
}
------------=========EntityBean(连接MSSQL200) 配过程
1.配置EJB服务器组件
1.1 添加持久化的配置文件
1.1.1 在src下添加一个文件夹META-INF,在本文件夹下添加两个文件:persistence.xml和persistence_1_0.xsd
persistence.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd ">
<persistence-unit name="personTable">
<jta-data-source>java:/MSSQLDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
--其中<persistence-unit name="personTable">的name值必须和dao中的实现类中:@PersistenceContext(unitName="personTable")
内容一致;
1.1.2 添加数据源配置文件,本例使用MSSQL2000,添加数据源,使用sql2005的驱动,从D:/Software/jboss-4.2.2.GA/docs/examples/jca拷贝mssql-ds.xml
到D:/Software/jboss-4.2.2.GA/server/all/deploy下,
具体参数设置:
<jndi-name>MSSQLDS</jndi-name>
<connection-url>jdbc:sqlserver://localhost:1433;DatabaseName=kevinb</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<user-name>sa</user-name>
<password>ffffff</password>
...
1.1.3 向JBoss添加数据库驱动
向D:/Software/jboss-4.2.2.GA/server/all/lib,添加驱动sqljdbc.jar(MSSQL2005驱动)
1.2 新建一个EJB3.0工程
1.3 添加com.dao 和com.bean包,同时在bean中添加持久化POJO对象(如:Person);
在com.dao中添加一个无状态的session bean,在接口中添加相应的持久化操作方法:
如PersonDao:
public boolean insertPerson(String name,String sex,int age,Date birthday);
public String getPersonNameByPersonId(int personId);
public Person getPersonByPersonId(int personId);
在PersonDaoBean:
中添加相应方法的操作;
1.4 打包发布.jar
向D:/Software/jboss-4.2.2.GA/server/all/deploy下发布.jar文件,确保启动过程没有任何错误,同时可到数据库版本号和驱动版本号;
2. 配置客户端文件
2.1 添加一个web project;
2.2 向lib下添加entityBean.jar和jbossall-client.jar
2.3 处理页面信息,调用ejb组建中的dao操作,向数据库中持久化数据和查询数据;
<%
Properties p = new Properties();
p.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
p.setProperty("java.naming.provider.url","localhost:1099");
Context ct = new InitialContext(p);
try{
PersonDao persondao = (PersonDao) ct.lookup("PersonDaoBean/remote");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
out.println("<br>---------persondao.insertPerson()--------");
persondao.insertPerson("kevinb","M",28,formatter.parse("1980-10-09"));
...
2.4 发布工程,进行测试;