使用jpa配置步骤回顾:
1、
拷贝数据库驱动到JBOSS_HOME/server/default/lib下
拷贝docs/examples/jca/mysql-ds.xml到/server/default/deploy目录下,并修改数据库用户名及密码
Mysql-ds.xml文件的内容类似下面所示:
2、建立一个项目支持EntityBean(给项目添加jpa支持)
3、在创建完成后,会自动在META-INF下添加persistence.xml配置文件
4、具体编码
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);
}
}