<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方言。
<?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>
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实例。每一种方法也都通过容器自动分配一个事务。事务在调用方法时启动,并在方法返回时提交。(当方法内抛出异常时它则回滚)
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注入如何改善代码的可读性。
应用程序的完全可移植性通常不是使用JPA或者EJB3.0的主要原因,毕竟,你决定了要用Hibernate作为JPA持久化的提供程序。来看看你可以如何退回并使用Hibernate原生的特性。
代码下载JPA内嵌EJB地址:
Hibernate实战_笔记12(JPA内嵌EJB),布布扣,bubuko.com
原文:http://blog.csdn.net/com185272358/article/details/20918645