在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;

@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);
}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值