开发单表映射的实体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
abstract
List<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。

发布:

因为这个持久化单元配置文件使用到了数据源,所以在发布之前要确保发布了数据源。

接下来可以编写客户端方法了,采用单元测试:

在接口右点击新建单元测试,

拷贝一份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

EJB_开发单表映射的实体bean的更多相关文章

  1. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  2. Mybatis注解开发单表CRUD

    Mybatis注解开发单表CRUD mybatis注解开发和xml开发不可兼容,要么全部使用注解,要么全部使用xml,个人建议注解,简单. 当实体类属性名称和数据库表属性名称一致时:无需配置Resul ...

  3. ABAP表生成Java实体Bean

    项目中需要将HR模块中的表数据同步到Java系统中,向外围系统提供分发与查询服务,涉及到的表有两百多张,字段好几千上万个,如果手工一张张这些ABAP表在Java系统数据库中创建一遍的话,工作量将非常大 ...

  4. mysql 表映射为java bean 手动生成。

    在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: ),)) BEGIN ); ) ...

  5. 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

    在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...

  6. mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置

    mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置 ============================== 蕃薯耀 2018年3月14 ...

  7. Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)

    上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...

  8. Hibernate 表映射 主键生成策略与复合主键

    主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射  Hibernate封装了数据库DDL语句,只需要将数据 ...

  9. EF Code First 学习笔记:表映射

    多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...

随机推荐

  1. [HNOI2011]数矩形

    题目描述 最近某歌手在研究自己的全球巡回演出计划,他将所有心仪的城市都用平面上的一个点来表示,并打算从中挑选出 4 个城市作为这次巡回演出的地点. 为了显示自己与众不同,他要求存在一个矩形使得挑选出的 ...

  2. C++Primer学习——未定义行为

    定义: 主要是求值顺序的问题 int i = f1() + f2();          //我们无法知道是f1 还是 f2先被调用 而且求值顺序和优先级和结合律无关,比如: f() + g()*h( ...

  3. hdu 5480(前缀和)

    题意:如果一个点,则这点的横竖皆被占领,询问矩阵是否全被占领. 思路:将被占领的x,y标记为1,用x表示1 - i的和 如果x轴的差为 x2 - x1 + 1则表示全被占领,y轴同理 #include ...

  4. bzoj 2004: [Hnoi2010]Bus 公交线路

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...

  5. 例10-6 uva1635(唯一分解定理)

    题意:给定n个数a1,a2····an,依次求出相邻两个数值和,将得到一个新数列,重复上述操作,最后结果将变为一个数,问这个数除以m的余数与那些数无关? 思路:最后观察期规律符合杨辉三角,那么,问题就 ...

  6. django rest-framework 3.类 实现restful

    上节提到过,REST框架分别提供了对函数和类的装饰器,之前已经都是通过函数来写视图函数的,现在来尝试使用class 类来实现视图函数 使用基于类编写API视图,允许重用常用的功能,减少代码重复. 一. ...

  7. python 类的特殊成员方法

    __doc__ # 输出类的描述信息 __module__ # 表示当前操作的对象在那个模块 __class__ # 表示当前操作的对象的类是什么 __init__ # 构造方法,通过类创建对象是,自 ...

  8. IBM-x3650做RAID5更换硬盘后rebuild步骤分享

    1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...

  9. Servlet init()

    有时候希望在servlet首次载入时,执行复杂的初始化任务,但并不想每个请求都重复这些任务的时候,用init()方法他在servlet初次创建时被调用,之后处理每个用户的请求时,则不在调用这个方法.因 ...

  10. jquery easyui datagrid 编辑行 类型combobox

    完成编辑瞬间datagrid中显示的是combobox的value 而非text var rows=$('#tb1').datagrid('getRows'); for(var i=0;i<ro ...