首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

在EJB中施用JPA以及JPA中的方法与Hibernian中的几点对比

2012-10-06 
在EJB中使用JPA以及JPA中的方法与Hibernian中的几点对比使用jpa配置步骤回顾:1、拷贝数据库驱动到JBOSS_HOM

在EJB中使用JPA以及JPA中的方法与Hibernian中的几点对比
使用jpa配置步骤回顾:
1、
拷贝数据库驱动到JBOSS_HOME/server/default/lib下
拷贝docs/examples/jca/mysql-ds.xml到/server/default/deploy目录下,并修改数据库用户名及密码
Mysql-ds.xml文件的内容类似下面所示:

<datasources>  <local-tx-datasource>    <jndi-name>MySqlDS</jndi-name>    <connection-url>jdbc:mysql://localhost/ejb3</connection-url>    <driver-class>com.mysql.jdbc.Driver</driver-class>    <user-name>root</user-name>    <password>root</password>    ........

2、建立一个项目支持EntityBean(给项目添加jpa支持)
3、在创建完成后,会自动在META-INF下添加persistence.xml配置文件
<!-- 注意配置文件的各个配置项要与jboss\server\default\deploy\mysql-ds.xml的配置文件要相符 --><persistence-unit name="test" transaction-type="JTA">  <jta-data-source>java:/MySqlDS</jta-data-source>  <class>com.bjsxt.jpa.Person</class>  <exclude-unlisted-classes>true</exclude-unlisted-classes>  <properties>  <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>  <property name="hibernate.show_sql" value="true"/>  <property name="hibernate.hbm2ddl.auto" value="update"/>  </properties></persistence-unit>

4、具体编码
//参数传值对象User注意序列化import java.io.Serializable;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entitypublic class Person implements Serializable{@Id@GeneratedValueprivate int id;private String name;public int getId() {return id;}public String getName() {return name;}public void setId(int id) {this.id = id;}public void setName(String name) {this.name = name;}}//定义接口public interface PersonService {public void addPerson(Person person);public void delPerson(int id);public void updatePerson(Person person);public List<Person> getPerson();public Person getPerson(int id);public void delPerson(Person p);}//定义实现import javax.ejb.Local;import javax.ejb.Remote;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;@Stateless@Remote@Localpublic class PersonServiceImpl implements PersonService {@PersistenceContext(unitName="test")private EntityManager entityManager;public void delPerson(int id) {       entityManager.remove(getPerson(id));}public List<Person> getPerson() {return entityManager.createQuery("from Person").getResultList();}public void updatePerson(Person person) {entityManager.merge(person);}public void addPerson(Person person) {entityManager.persist(person);}public Person getPerson(int id) {Person p = entityManager.getReference(Person.class, id);//find相当于Hibernate中的get         //entityManager.find(Person.class, id);         //getReference相当于Hibernate中的load,是懒加载的如果直接在客户端调用会因为session关闭而报错,采用get不会出现此问题          //加入下面的一句话,让session提前将数据加载上来再关闭。                  System.out.println(p.getName());return p;}public void delPerson(Person p) {entityManager.remove(p);}//客户端测试import javax.naming.InitialContext;import javax.transaction.UserTransaction;import com.bjsxt.jpa.Person;import com.bjsxt.jpa.PersonManager;public class Client {public static void main(String[] args) throws Exception {InitialContext context =new InitialContext();PersonManager pm=(PersonManager)context.lookup("PersonImpl/remote");Person p=new Person();p.setName("www");pm.addPerson(p);Person p=pm.getPerson(5);    //因为服务器端用的是getReference 所以上一句的getPerson方 法调用完成之后一次会话结束,Session已经关闭,所以下面p.getName会报错误,但我们在方法中又加入了一句System.out.println(p.getName());将数据提前加载了所以不会报错了System.out.println(p.getName());Person p=pm.getPerson2(5);System.out.println(p.getName());//System.out.println(pm.getPersons().size());//um.commit();Person p=new Person();p.setId(5);p.setName("xxxxxxxxxxxxx");pm.updatePerson(p);pm.deletePerson(5);}}

热点排行