开发单表映射的实体bean
实体bean
它属于java持久化规范(JPA)里的技术,实体bean通过元数据在Javabean和数据库表之间建立起映射关系,然后Java程序猿就能够随心所欲的使用面向对象的编程思想来操纵数据库。
JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,眼下实现的JPA规范的主流产品有Hibernate、TopLink和OpenJPA,在JBoss中採用了Hibernate 作为其持久化实现产品。
加入JPA的配置文件persistence.xml
依据JPA规范的要求:在实体bean应用中,我们须要项目根文件夹下新建META-INF文件夹增加持久化配置文件persistence.xml
步骤:
新建一个实体bean项目,新建JavaProject:EntityBean,加入EJBjar文件,在项目根文件夹下新建一个META-INF文件夹→新建persistence.xml
<?xml version="1.0"?>
<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>
在persistence里定义一个持久化单元。就是一堆实体类的集合。
<persistence-unit name="hqu" transaction-type="JTA">
<jta-data-source>java:hquDS</jta-data-source>
</persistence-unit>
<persistence-unit name="hqu" transaction-type="JTA">
<jta-data-source>java:hquDS</jta-data-source>
<properties>
<!--測试阶段以下Hibernate非常实用-->
<property name="hibernate.hbm2ddl.auto" value="update" />
<!--显示终于运行的SQL-->
<property name="hibernate.show_sql" value="true" />
<!--格式化显示的SQL-->
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
开发实体bean:
在src下新建Person在cn.hqu.bean下,id。name,和getter。setter。
序列化,重写hashcode和equals。
和数据库进行映射(数据库hqutest要有一张叫person的表有id和name)。採用注解
至少有一个主键@Id
package cn.hqu.bean; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "person") public class Person implements Serializable { private Integer id; private String name; @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="name",length=20,nullable=false) public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
加入对实体bean进行增删改查,
新建会话bean:
1.新建接口PersonService在cn.hqu.service下
public interface PersonService {
public abstract void save(Person person);
public abstract void update(Person person);
public abstract void delete(Integer id);
public abstractList<Person> getPersons();
}
2.定义接口的实现类:
PersonServiceBean在cn.hqu.service.impl
package cn.hqu.service.impl; import java.util.List; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import cn.hqu.bean.Person; import cn.hqu.service.PersonService; @Stateless @Remote(PersonService.class) public class PersonServiceBean implements PersonService { @PersistenceContext EntityManager em; @Override public void save(Person person) { //对新建状态的实体进行保存。在实体bean中有四种状态: //新建状态,托管状态。游离状态。删除状态 em.persist(person); } @Override public void update(Person person) { //调用merge的前提是person已经处于游离状态。在这个状态的情况下。 //对bean进行改动,才调用merge方法。//假设对象属于托管状态。我们直接调用person的save方法就能够进行改动了。 em.merge(person); } @Override public void delete(Integer id) { //删除数据不是必需再查询,使用getReference性能比較好, //getReference得到的是托管状态的实体。 em.remove(em.getReference(Person.class, id)); } @SuppressWarnings("unchecked") @Override public List<Person> getPersons() { return em.createQuery("select o from Person o").getResultList(); } }
会话bean和实体bean都编制好了,接下来相应用进行打包公布。
採用Ant
拷贝一份HelloWorld的Ant配置文件进行改动:
name换成EntityBean加入
运行打包工作,Ant,deploy。
公布:
由于这个持久化单元配置文件使用到了数据源,所以在公布之前要确保公布了数据源。
接下来能够编写client方法了,採用单元測试:
在接口右点击新建单元測试,
拷贝一份HelloWorld的jndi.properties到项目src文件夹下。
package junit.test; import static org.junit.Assert.fail; import java.util.List; import javax.naming.InitialContext; import org.junit.BeforeClass; import org.junit.Test; import cn.hqu.bean.Person; import cn.hqu.service.PersonService; public class PersonServiceTest { private static PersonService personService; @BeforeClass public static void setUpBeforeClass() throws Exception { try { InitialContext ctx = new InitialContext(); personService = (PersonService) ctx.lookup("PersonServiceBean/remote"); } catch (Exception e) { e.printStackTrace(); } } @Test public void testSave() { personService.save(new Person("苏志达")); } @Test public void testUpdate() { Person person = personService.getPerson(2); person.setName("xxx"); personService.update(person); } @Test public void testDelete() { personService.delete(1); } @Test public void testGetPersons() { List<Person> personList = personService.getPersons(); for (Person person : personList) { System.out.println(person.getName()); } } @Test public void testGetPerson() { System.out.println(personService.getPerson(2).getName()); } }
运行公布,deploy
问题:
执行ant的deploy,报错。test问题,指定不编译junit 27行
<target name="compile" depends="prepare" description="编译">
<!--对源文件进行编译,destdir编译后class存放文件夹-->
<javac srcdir="${src.dir}" destdir="${build.dir}" includes="cn/**">
<!--编译依赖的jar文件-->
<classpath refid="build.classpath"></classpath>
</javac>
</target>
产生乱码。将数据库改动为UTF-8,
或者改动
实体bean就开发就完了。
源代码:http://pan.baidu.com/s/1pJ7Eunx