`

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

    博客分类:
  • EJB
阅读更多
使用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;

@Entity
public class Person implements Serializable{
	@Id
	@GeneratedValue
	private 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
@Local
public 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);
	}

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics