上一章我们介绍了EJB的数据源配置.这一章我们介绍一下基本的EJB save操作.
首先,建立一个EJB Bean.
package com.cnblogs.pojo;
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;
/**
* 定义这是一个entityBean
* @author asus
*
*/
@Entity
@Table(name="person")//映射表名称为person
public class Person implements Serializable{//实现可序列化接口.方便远程调用
/**
* 这个ID是一定要定义的,hibernate也一样要定义.
* 如果我们只定义一个ID.不定义他的生成策略,就相当与没有生成策略,要我们自己设定他的ID值.
* 如果我们指定他的生成策略.就是@GeneratedValue.这样,就相当与会自动生成ID.
* 他会根据数据库选择生成策略.如果是MYSQL.就是以IDENTITY方式生成主键
* 如果是ORACLE就是以Sequence方式生成主键.
* 跟Hibernate的native是一个意思.
* @GeneratedValue(strategy=GenerationType.TABLE)
* 这种方式通过一个表来实现主键id的自增,这种方式不依赖于具体的数据库,可以解决数据迁移的问题
* 所以,这个主键的方式,我们不设置括@GeneratedValue的属性.或者设置为TABLE.方便数据迁移.
* 关于table策略.下章会详细讲解.如果我们需要用String类型的ID.数据库又自动生成.也就是hibernate的UUID也是可以的.不过需要引入JAR包.下一章同样会给出方法.
*/
@Id
@GeneratedValue
private int id;
/**
* column字段主要有以下属性:
* name:字段名
* unique:是否唯一
* nullable:是否可以为空
* inserttable:是否可以插入
* updateable:是否可以更新
* columnDefinition:定义建表时创建此列的DDL
* secondaryTable:从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。
* 这里我们根据情况常用的是name,unique,nullable
*/
@Column(name="username",unique=false)
private String name;
@Column(name="password",nullable=false)
private String passwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
写一下service和serviceImpl
package com.cnblogs.service;
import com.cnblogs.pojo.Person;
public interface PersonService {
public void addPserson(Person p);
}
package com.cnblogs.serviceImpl;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.cnblogs.pojo.Person;
import com.cnblogs.service.PersonService;
@Stateless(name="personService")
@Remote
public class PersonServiceImpl implements PersonService {
/**
* 在这里注入EntityManager相当与Hibernate的session
* 这里的unitName就是persistence.xml的JTA数据源. 如果这个方法里想对多个数据库操作.就再注入一个EntityManager
*/
@PersistenceContext(unitName = "ejb_01PU")
private EntityManager em;
public void addPserson(Person p) {
/**
* 在JPA里.保存是persist.在HIBERNATE里.叫SAVE.只是名字换了.
*/
em.persist(p);
}
}
然后我们写一个WEB应用.调用这个方法.首先添加EJB本地项目的依赖
然后写一个TEST类
package com.cnblogs.test;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.cnblogs.pojo.Person;
import com.cnblogs.service.PersonService;
public class Test {
public static void main(String[] args) throws NamingException {
InitialContext context = new InitialContext();
PersonService ps = (PersonService) context.lookup("personService/remote");
Person p1 = new Person();
p1.setName("张三");
p1.setPasswd("zhangsan");
ps.addPserson(p1);
}
}
添加jndi.properties到WEB项目的根目录.
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
然后把JBOSS的JAR添加到WEB项目.(JBOSSHOME/client下所有的JAR包)
然后启动JBOSS.添加2个项目进去.
运行TEST类.
OK.结束.