Hibernate实战_笔记12(JPA内嵌EJB)

在上一扁已经安装EJB容器,接下来,需要改变之前应用程序的持久化单元配置,来访问一个托管的JTA数据源。

先看一下JPA引入EJB组件之后项目的结构:


1、配置持久化单元

<persistence 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
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="helloworld">
		<jta-data-source>java:/BdqnDS</jta-data-source>
		<properties>
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
			<property name="hibernate.hbm2ddl.auto" value="create" />
		</properties>
	</persistence-unit>
</persistence>
      你去除了许多不再有关系的Hibernate配置选项,例如连接池和数据库连接设置。反之,你用JNDI中绑定的数据源名称设置了一个<jta-data-source>属性。别忘了你仍然需要配置正确的SQL方言。
那么你是否想问连接池和数据库连接去哪了呢?

2、JBoss数据源配置

      现在配置到了jboss/server/default/deploy目录下,文件名为oracle-ds.xml(我数据库是Oracle),如果你们使用的数据库不相同,首先在jboss/docs/examples/jca目录下复制对应的数据源配置模板文件
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
	<local-tx-datasource>
		<jndi-name>BdqnDS</jndi-name>
		<connection-url>jdbc:oracle:thin:@localhost:1521:orcl
		</connection-url>
		<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
		<user-name>system</user-name>
		<password>bdqn</password>
		<min-pool-size>0</min-pool-size>
        <max-pool-size>10</max-pool-size>
        <blocking-timeout-millis>30000</blocking-timeout-millis>  
        <idle-timeout-minutes>30</idle-timeout-minutes>
		<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
		</exception-sorter-class-name>
		<metadata>
			<type-mapping>Oracle</type-mapping>
		</metadata>
	</local-tx-datasource>
</datasources>

3、编写EJB

实现一个无状态会话bean,同样的步骤。
步骤1、2、5、6省略
3)、编写接口
package cn.jbit.ejbjpa.dao;

public interface MessageDao {

	public void saveMessages();
	public void showMessages();
}
4)、编写实现类
package cn.jbit.ejbjpa.dao.impl;

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


import cn.jbit.ejbjpa.dao.MessageDao;
import cn.jbit.ejbjpa.entity.Message;


@Stateless
@Remote(MessageDao.class)
public class MessageDaoImpl implements MessageDao {


	@PersistenceContext(name = "helloworld")
	EntityManager em;


	public void saveMessages() {
		Message message = new Message("Hello World");
		em.persist(message);
	}


	@SuppressWarnings("unchecked")
	public void showMessages() {
		List<Message> messages = em.createQuery(
				"select m from Message m order by m.text asc").getResultList();
		System.out.println(messages.size() + "条消息记录");
		for (Message message : messages) {
			System.out.println(message.getText());
		}
	}
}
      在这个实现中要观察几件值得关注的事。首先,这是个简单的Java类,没有强烈地依赖于任何其他的包。它变成了一个只有单个元数据注解@Stateless的EJB。EJB支持容器托管的服务,因此可以应用@PersistenceContext注解,并且每当调用这个无状态bean中的方法时,服务器就注入一个全新的EntityManager实例。每一种方法也都通过容器自动分配一个事务。事务在调用方法时启动,并在方法返回时提交。(当方法内抛出异常时它则回滚)

4、运行应用程序

package cn.jbit.ejbjpa.test;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import cn.jbit.ejbjpa.dao.MessageDao;

public class Test {

	public static void main(String[] args) throws NamingException {
		MessageDao messageDao = null;
		try {
			InitialContext ctx = new InitialContext();
			messageDao = (MessageDao) ctx.lookup("MessageDaoImpl/remote");
		} catch (NamingException e) {
			e.printStackTrace();
		}
		System.out.println(messageDao);
		messageDao.saveMessages();
		messageDao.showMessages();
	}
}
      要查找EJB,需要一个InitialContext,这是JNDI注册的入口点。如果实例化InitialContext,Java就会自动在classpath中查找文件jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost\:1099
      这样,就用托管的EJB组件和集成的JPA完成了我们的第一个例子。你可能已经知道自动的事务划分和EntityManager注入如何改善代码的可读性。
      说明:持久化单元的包——我们之前没有过多谈论持久化单元的包,如果要使用完全应用程序服务器上的热重新部署(hot redeployment),需要正确地打包应用。这包括JAR、WAR、EJB-JAR和EAR的一般组件。部署和打包经常也是特定于供应商的,因此应该参考你应用程序服务器的文档了解更多信息。JPA持久化单元的作用范围可以到JAR、WAR和EJB-JAR,这意味着这些文档中的一个或者几个包含了所有注解的类,以及带有这个特定单元的所有设置的一个META-INF/persistence.xml配置文件。可以把一个或者几个JAR、WAR和EJB-JAR包在单个企业应用文档EAR中。你的应用程序服务器应该正确地发现所有持久化单,并自动地创建必要的工厂。用@PersistenceContext注解中的一个单元名称属性,指示容器从一个特定的单元注入EntityManager。

应用程序的完全可移植性通常不是使用JPA或者EJB3.0的主要原因,毕竟,你决定了要用Hibernate作为JPA持久化的提供程序。来看看你可以如何退回并使用Hibernate原生的特性。

代码下载JPA内嵌EJB地址:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值