1 整体结构
client文件存放 ejb客户端的一些jar包
Animal.java 中配置命名查询
Person.java 中实现了方法监听和类监听两种监听方式( 在增删查改方法执行之前后之后调用监听方法)
JpaCurdTest.java 为 Junit测试增删查改
2 代码
Animal.java
package leaning.entity;
import java.io.Serializable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.InheritanceType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
/**
* 单表继承A
* */
@Entity
@NamedQueries( // 命名查询
{
@NamedQuery(name="searchAnimals",query="select a FROM Animal a where a.name like :name"),
@NamedQuery(name="searchAllAnimals",query="select a FROM Animal a")
}
)
public class Animal implements Serializable{
@Id
@GeneratedValue
private int id;
private String name;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Person.java
package leaning.entity;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PrePersist;
@Entity
@EntityListeners(PersonListener.class) // 监听方法2 ,自定义在一个类中
public class Person implements Serializable{
@Id
@GeneratedValue
private int id;
private String name;
private String address;
public int getId() {
return id;
}
/**
* 监听方法1
* 实体对象的回调方法,通过PrePersist注解,可以将这个方法变为
* 当实体对象被保存之前自动调用的方法
* 可用注解有 : PrePersist,PostPersist,PreRemove,PostRemove
* PreUpdate,PostUpdate,PostLoad
* **/
@PrePersist
public void doSomeThing(){
System.out.println("@PrePersist 实体对象即将保存 : name = " + name);
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
PersonListener.java
package leaning.entity;
import javax.persistence.PostPersist;
public class PersonListener {
/**
* 自动调用该方法
* */
@PostPersist
public void doSomething(Person person){
System.out.println("@PostPersist 实体对象已经被加载, name = " + person.getName());
}
}
PersonManager.java
package leaning.entity;
import java.util.List;
public interface PersonManager {
public void addPerson(String name);
public void removePerson(int id);
public void removePerson1(int id);
public void updatePerson(int id,String updateName);
public Person findPerson(int id);
public Person findPerson2(int id);
public List searchPerson1();
public List searchPerson2();
public List searchPerson3();
public List searchAnimals();
public List searchAllAnimals();
}
PersonManagerBean.java
package leaning.entity;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless(name="personManager")
@Remote
public class PersonManagerBean implements PersonManager{
@PersistenceContext(unitName="curdUnit")
private EntityManager em;
public void addPerson(String name) {
Person p = new Person();
p.setName(name);
em.persist(p);
}
public void removePerson(int id) {
Person p = em.find(Person.class, id);
em.remove(p);
}
//这种方法不能删除
public void removePerson1(int id) {
Person p = new Person();
p.setId(id);
em.remove(p);
}
public void updatePerson(int id, String updateName) {
Person p = new Person();
p.setId(id);
p.setName(updateName);
em.merge(p);
}
public Person findPerson(int id) {
//相当于hibernate中的get操作
return em.find(Person.class, id);
}
public Person findPerson2(int id) {
//相当于hibernate中的Load操作,加载的是一个代理类
return em.getReference(Person.class, id);
}
//利用EJB-QL 查询所有的人员
public List searchPerson1() {
return em.createQuery("from Person").getResultList();
}
public List searchPerson2() {
return em.createQuery("select p from Person p where p.name like ?")
.setParameter(1, "%李%") //索引值从1开始{与hibernate中从0开始不同}
.getResultList();
}
public List searchPerson3() {
return em.createQuery("select p from Person p where p.name like :name")
.setParameter("name", "%李%")
.getResultList();
}
/**
* 测试命名查询和多台查询
* */
public List searchAnimals() {
return em.createNamedQuery("searchAnimals")
.setParameter("name", "%鸭%")
.getResultList();
}
public List searchAllAnimals() {
return em.createNamedQuery("searchAllAnimals").getResultList();
}
}
测试类 JpaCurdTest.java
package leaning.test;
import static org.junit.Assert.*;
import java.util.List;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import leaning.entity.Animal;
import leaning.entity.Person;
import leaning.entity.PersonManager;
import org.junit.Test;
/**
* JPA增删查改测试
* **/
public class JpaCurdTest {
@Test
public void test() throws NamingException {
}
@Test
public void testAddPerson() {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
personManager.addPerson("张三");
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testRemovePerson() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
personManager.removePerson(3);
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testRemovePerson1() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
personManager.removePerson1(3);
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testUpdatePerson() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
personManager.updatePerson(3, "updateName");
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testFindPerson() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
Person p = personManager.findPerson(4);
System.out.println("name = " + p.getName());
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testFindPerson2() {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
Person p = personManager.findPerson2(4);
System.out.println("name = " + p.getName());
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testSearchPerson1() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
List list = personManager.searchPerson1();
showList(list);
} catch (NamingException e) {
e.printStackTrace();
}
}
private void showList(List<Person> list){
if(list==null) return ;
for(int i = 0 ; i < list.size() ; i++){
Person p = list.get(i);
System.out.println("name = " + p.getName());
}
}
private void showAnimalList(List<Animal> list){
if(list==null) return ;
for(int i = 0 ; i < list.size() ; i++){
Animal animal = list.get(i);
System.out.println("name = " + animal.getName() );
}
}
@Test
public void testSearchPerson2() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
List list = personManager.searchPerson2();
showList(list);
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testSearchPerson3() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
List list = personManager.searchPerson3();
showList(list);
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testSearchAnimals() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
List list = personManager.searchAnimals();
showAnimalList(list);
} catch (NamingException e) {
e.printStackTrace();
}
}
@Test
public void testSearchAllAnimals() throws NamingException {
InitialContext context;
try {
context = new InitialContext();
PersonManager personManager = (PersonManager)context.lookup("personManager/remote");
List list = personManager.searchAllAnimals();
showAnimalList(list);
} catch (NamingException e) {
e.printStackTrace();
}
}
}
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<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="curdUnit" transaction-type="JTA">
<jta-data-source>java:/MySqlDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost
java.naming.factory.url.pkgs=org.jboss.naming\:org.jnp.interfaces