<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.propertiesjava.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