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。
发布:
因为这个持久化单元配置文件使用到了数据源,所以在发布之前要确保发布了数据源。
接下来可以编写客户端方法了,采用单元测试:
在接口右点击新建单元测试,
拷贝一份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的更多相关文章
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
- Mybatis注解开发单表CRUD
Mybatis注解开发单表CRUD mybatis注解开发和xml开发不可兼容,要么全部使用注解,要么全部使用xml,个人建议注解,简单. 当实体类属性名称和数据库表属性名称一致时:无需配置Resul ...
- ABAP表生成Java实体Bean
项目中需要将HR模块中的表数据同步到Java系统中,向外围系统提供分发与查询服务,涉及到的表有两百多张,字段好几千上万个,如果手工一张张这些ABAP表在Java系统数据库中创建一遍的话,工作量将非常大 ...
- mysql 表映射为java bean 手动生成。
在日常工作中,一般是先建表.后建类.当然也有先UML构建类与类的层级关系,直接生成表.(建模)这里只针对先有表后有类的情况.不采用代码生成器的情况. 例如: 原表结构: ),)) BEGIN ); ) ...
- 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...
- mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置
mybatis generator配置,Mybatis自动生成文件配置,Mybatis自动生成实体Bean配置 ============================== 蕃薯耀 2018年3月14 ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- Hibernate 表映射 主键生成策略与复合主键
主要分析三点: 一.数据表和Java类的映射 : 二.单一主键映射和主键的生成策略 : 三.复合主键的表映射 : 一.数据表和Java类的映射 Hibernate封装了数据库DDL语句,只需要将数据 ...
- EF Code First 学习笔记:表映射
多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...
随机推荐
- Redis常用命令--Keys
Redis是一个key-value型的数据库. 所以在Redis也提供了很多操作key的命令,大概有22个. EXISTS key [key ...]:查询一个key是否存在,时间复杂度为O(1),存 ...
- poj 1012——Toseph
提交地址:http://poj.org/problem?id=1012 ...
- hzoj 2301(莫比乌斯反演)
题意 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公 数. 思路: 与先前的那个相比,这次a,c并不一定 ...
- hdu 3436 splay树+离散化*
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 树链剖分模板(BZOJ3083)
实现了路径修改,子树查询,及换根. 换根其实很简单,分三种情况讨论,画画图就明白了. #include <cstdio> #include <algorithm> using ...
- I/O控制的主要功能
主要功能: 1. 解释用户的I/O系统调用.将用户I/O系统调用转换为I/O控制模块认识的命令模式. 2. 设备驱动.根据得到的I/O命令,启动物理设备完成指定的I/O操作. 3. 中断处理.对 ...
- break 与 continue
1.break ①只有一层循环时,作用是跳出循环语句,执行后面的代码. ②break存在于循环嵌套的内层循环时,只能跳出内层循环,如果想要跳出外层循环,需要对外层循环添加标记. 2.continue ...
- BI之SSIS入门最新版Visual Studio调试技巧
简介 最近公司业务需要用到BI SSIS,SSIS是什么?"SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案( ...
- Go实现海量日志收集系统(四)
到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSearch,并且最终通过kiban ...
- day0203 XML 学习笔记
day02, 03 1. xml语言和作用 2. xml语法详解 2.1 xml 语法声明 2.1.1 encoding 属性 2.1.2 standalone 属性 2.2 xml 元素(Eleme ...