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
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。

公布:

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

接下来能够编写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

时间: 2024-10-14 01:56:03

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

ABAP表生成Java实体Bean

项目中需要将HR模块中的表数据同步到Java系统中,向外围系统提供数据服务,涉及到的表有两百多张,字段好几千上万个,如果手工一张张这些ABAP表在Java系统数据库中创建一遍的话,工作量将非常大,而且容易出错.   该ABAP代码就是将需要的表转换成Java中的实体Bean,然后就可以使用Hibernate之类的持久化框架来自动生成表了. ABAP代码没有重构过,写得有点乱......将就着看吧 REPORT  ytab2javabean.DATA: p_table TYPE string. S

表映射的实体类用到的注解

@Id如果这个字段是主键就要加上, @GeneratedValue(strategy = GenerationType.IDENTITY)表示自增长. @Column(name = "username")表示把字段和数据库的名字对应,理解成起别名 @Table注解 作用是 : 声明此对象映射到数据库的数据表,通过它可以为实体指定表(talbe) @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,不会将其持久化到数据库的对应属性列中. 原文地址:htt

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

---恢复内容开始--- 在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: 假如这是我业务变动,添加的一个表,同时我也要建对应的java类时.一般我们是手动去复制.容易出错.而且也是体力活.这里面可以用SQL直接生成. -- 创建存储 通过系统表解析出表的结构.然后把表结构拼接成java类. CREATE PROCEDURE mypro(in tablename varchar

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

在EJB 2.x中,EJB有3种类型的Bean,分别是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随着EJB 3的推出,EJB2.x中的实体Bean逐渐被JPA规范所替代,JPA不仅能在EJB环境中使用,而且能在Java SE.Java EE环境中使用,相对于EJB 2.x中的实体Bean,它的使用范围更广. 但这里我们仍然将其称做实体Bean. 与会话Bean和消息驱动Bean类似,新的实体Be

持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass

通过以前的文章,我们了解到@Table.@Column.@Id实现了单表的映射,并且书剑有一个@Id指定的唯一字段.有时我们的数据表也许是有多个主键联合组成的,因此对于单表映射的主键,还可以进行如下两种联合主键映射. 联合主键:使用@IdClass指定外部主键 联合主键:使用@EmbeddedId嵌入外部主键 下面通过实例来看这两种主键的开发方法. Demo:设计一个家庭表Family的数据结构 ==================================================

持久化API(JPA)系列(八)实体关系映射(ORM)之单表映射@EmbeddedId

接上文<持久化API(JPA)系列(七)实体关系映射(ORM)之单表映射@IdClass> 本文将介绍<联合主键:使用@EmbeddedId嵌入外部主键> 上文是通过@IdClass引用外部主键,联合主键也可以采用嵌入式主键替代. 1)新建外部主键类Family2.java 设置联合主键man和woman,因此外部主键也需要定义两个相同的变量,并添加一个以两个变量为输入的构造函数,同时添加getter/setter函数. 主键类必须满足: 1.必须实现Serializable接口,

关于hibernate 多实体(多表)连接查询映射到实体的讨论

前提表与实体信息: 在hibernate 查询中,我们经过遇到三种情况: 1.查询事个实体,如: select  b from TableB b; 返回的LIst 中封装的是 实体TableB的实例. 2.查询单个属性,如: select b.id from TableB b; hibernate 返回的List 中封装的是ojbect对象. 3.当查询多于一个属性且又不是整个实体时,如:select b.id,b.mes from TableB b;返回的List中封装的是Object[]数组

EJB初级篇--EJB组件之实体Bean

上文我们对会话Bean的生命周期和两个子类型(有状态会话Bean和无状态会话Bean)进行了详细解说,本篇博文中我们继续说说EJB组件中的实体Bean. 其实实体Bean就是一个加了注释符(@Entity)的简单java对象(POJO),实体关系和O/R映射也是通过注释符来定义的,并且提供了几种不同的数据库操作规范.一旦被EntityManager访问,它就成为了一个持久化对象,我们就可以像以前使用Hibernate一样来使用实体对象了. 下图是实体Bean的内容结构图,方便我们宏观的了解实体B

Java实战之02Hibernate-04多表映射

十.多表映射 0.内容补充:数据完整性 作用:防止用户的误操作. 实体完整性:主键.用于确定表中唯一的一条记录. 域完整性:表中的字段. 数据类型约束: 非空约束: 唯一约束: 参照完整性: 多表设计:表之间的关系 一对多(用的最多的) 多对多(比较重要) 一对一(实际开发中,根本不用) 1.一对多关系映射(非常重要) 1.1.单向多对一映射 1 /** 2 * 客户的数据模型 3 * @author zhy 4 * 5 * 一个客户可以有多个订单 6 * 多个订单属于一个客户. 7 * 8 *