zoukankan      html  css  js  c++  java
  • EJB_开发单表映射的实体bean

    开发单表映射的实体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
  • 相关阅读:
    andorid UI事件 监听器
    12小时进制的时间输出的编辑代码
    Java运算符
    运算符的优先级
    UTF-8
    对ASCII的了解
    数组
    Java语法基础
    Java的跨平台
    指针的了解
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6709158.html
Copyright © 2011-2022 走看看