JBOSS7搭载EJB3之实体Bean

来源:互联网 发布:小米路由器域名重定向 编辑:程序博客网 时间:2024/05/18 01:10

  实体Bean--将简单的POJO通过注解的方法进行ORM(对象-关系)的映射,更多的看看JPA2.0手册吧

实体的四种状态 还是比较重要的

The entity lifecycle is managed by the underlying persistence provider.New (transient): an entity is new if it has just been instantiated using the new operator, and it is not associated with a persistence context. It has no persistent representation in the database and no identifier value has been assigned.Managed (persistent): a managed entity instance is an instance with a persistent identity that is currently associated with a persistence context.Detached: the entity instance is an instance with a persistent identity that is no longer associated with a persistence context, usually because the persistence context was closed or the instance was evicted from the context.Removed: a removed entity instance is an instance with a persistent identity, associated with a persistence context, but scheduled for removal from the database.


 参考文档: https://docs.jboss.org/author/display/AS71/JPA+Reference+Guide#JPAReferenceGuide-Containermanagedentitymanager

一样的  一个简单的例子  介绍 内容 

还是从EJB的提供者会话bean开始吧

package com.undergrowth.hello.impl;import java.util.List;import javax.ejb.Remote;import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import com.undergrowth.bean.Student;import com.undergrowth.hello.StudentService;/** * 将此服务类转为无状态的会话bean 操作 实体bean * @author Administrator * */@Stateless@Remote(StudentService.class)public class StudentServiceBean implements StudentService {//依赖注入实体管理器@PersistenceContext EntityManager em;@Overridepublic void save(Student student) {// TODO Auto-generated method stub//由新建状态转为托管状态em.persist(student);}@Overridepublic void delete(Integer id) {// TODO Auto-generated method stub//有托管状态转为销毁状态em.remove(getReferencesById(id));}@Overridepublic void update(Student student) {// TODO Auto-generated method stub//由游离态转为托管状态em.merge(student);}@Overridepublic Student getById(Integer id) {// TODO Auto-generated method stubreturn em.find(Student.class, id);}@SuppressWarnings("unchecked")@Overridepublic List<Student> getAllStudents() {// TODO Auto-generated method stub//使用JPQL进行查询结果集return (List<Student>)em.createQuery("select s from Student s").getResultList();}@Overridepublic Student getReferencesById(Integer id) {// TODO Auto-generated method stub//使用懒加载 返回代理对象  只有在使用get方法获取数据时  才加载对象return em.getReference(Student.class, id);}}

使用PersistenceContext进行注入JPA的实体管理器 用管理实体的上下文



查看它的接口  StudentService

package com.undergrowth.hello;import java.util.List;import com.undergrowth.bean.Student;/** * 对Student实体进行CRUD * @author Administrator * */public interface StudentService {public void save(Student student);public void delete(Integer id);public void update(Student student);public Student getById(Integer id);public Student getReferencesById(Integer id);public List<Student> getAllStudents();}

查看实体bean  Student 类与student相对应

package com.undergrowth.bean;import java.io.Serializable;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.Temporal;import javax.persistence.TemporalType;/** * 实体对象 将Student的POJO与表student进行ORM的映射 * 实现Serializable接口在于 可将此Student对象进行远程传输 * @author Administrator * */@Entity@Table(name="student")public class Student implements Serializable{/** *  */private static final long serialVersionUID = 1L;/** * @Id  表示表的主键对应的POJO的字段 * @GeneratedValue 表示主键的取值方式  此地连接的是oracle11g 采用序列的方式 为主键赋值 */@Id @GeneratedValue(strategy=GenerationType.SEQUENCE)private Integer id;/** * 指定列的长度为20个字符 */@Column(length=20)private String NAME;/** * 以日期格式建立  精确到时分秒 */@Column @Temporal(TemporalType.DATE)private Date birthday;@Columnprivate Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getNAME() {return NAME;}public void setNAME(String nAME) {NAME = nAME;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;return true;}@Overridepublic String toString() {return "Student [id=" + id + ", NAME=" + NAME + ", birthday="+ birthday + ", age=" + age + "]";}}

JPA的持久化配置文件  persistence.xml

<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_2_0.xsd"        version="2.0">    <persistence-unit name="under" transaction-type="JTA">    <jta-data-source>java:/myDataSource</jta-data-source>        <properties>         <property name="hibernate.hbm2ddl.auto" value="update" />         <property name="hibernate.show_sql" value="true" />         <property name="hibernate.format_sql" value="true"/>        </properties>    </persistence-unit></persistence>

数据源的配置 在上一篇里面已经说了  就不费话了


使用ant 打包发布到jboss中 并打包接口给第三方使用  build.xml

<?xml version="1.0" encoding="UTF-8"?><!-- ================================================ --><!-- Sample buildfile for jar components --><!-- --><!-- ================================================ --><project name="HelloWorld"  basedir=".">    <!-- 定义属性 -->    <property name="src.dir" value="${basedir}\src" />    <property environment="env"  />    <property name="jboss.home" value="${env.JBOSS_HOME}"/>    <property name="jboss.server.home" value="standalone"  />    <property name="dep" value="deployments"  />    <property name="build.dir" value="${basedir}\build"  />    <path id="build.classpath">    <fileset dir="${basedir}\lib">    <include name="*.jar" />    </fileset>    <pathelement location="${build.dir}" />    </path><!-- - - - - - - - - - - - - - --><!-- target: init --><!-- - - - - - - - - - - - - - --><target name="init"><delete dir="${build.dir}"></delete><mkdir dir="${build.dir}"></mkdir></target><!-- ========================= --><!-- target: compile --><!-- ========================= --><target name="compile" depends="init"description="--> compile  this component" ><javac srcdir="${src.dir}" destdir="${build.dir}" includes="com/**"><classpath refid="build.classpath" /></javac></target><!-- 打包 --><target name="ejbjar" depends="compile" description="打包ejb">   <jar jarfile="${basedir}\${ant.project.name}.jar">   <fileset dir="${build.dir}">   <include name="**/*.class"></include>   </fileset>   <metainf dir="${src.dir}\META-INF"></metainf>   </jar></target>    <!-- 部署 -->    <target name="delopy" depends="ejbjar" description="部署ejb">    <copy file="${basedir}\${ant.project.name}.jar"  todir="${jboss.home}\${jboss.server.home}\${dep}\" />    </target>        <!-- 卸载ejb -->    <target name="undeploy" description="卸载ejb">      <delete file="${jboss.home}\${jboss.server.home}\${dep}\${ant.project.name}.jar"></delete>    </target>    <!-- 打包接口 --><target name="package_inter" depends="compile" description="打包接口"><jar jarfile="${basedir}\${ant.project.name}Interface.jar">   <fileset dir="${build.dir}">   <exclude name="**/impl/*.class"></exclude>   </fileset>   </jar></target></project>


jboss中信息

19:22:04,634 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-2) JNDI bindings for session bean named StudentServiceBean in deployment unit deployment "HelloWorld.jar" are as follows:java:global/HelloWorld/StudentServiceBean!com.undergrowth.hello.StudentServicejava:app/HelloWorld/StudentServiceBean!com.undergrowth.hello.StudentServicejava:module/StudentServiceBean!com.undergrowth.hello.StudentServicejava:jboss/exported/HelloWorld/StudentServiceBean!com.undergrowth.hello.StudentServicejava:global/HelloWorld/StudentServiceBeanjava:app/HelloWorld/StudentServiceBeanjava:module/StudentServiceBean
解析持久化单元

19:22:04,885 INFO  [org.hibernate.ejb.Ejb3Configuration] (MSC service thread 1-3) HHH000204: Processing PersistenceUnitInfo [name: under...]19:22:04,883 INFO  [org.jboss.ws.common.management.DefaultEndpointRegistry] (MSC service thread 1-1) register: jboss.ws:context=HelloWorld,endpoint=WebServicesEjbTestBean19:22:04,889 INFO  [org.jboss.as.ejb3] (MSC service thread 1-2) JBAS014142: Started message driven bean 'JmsMessageConsumer' with 'hornetq-ra' resource adapter19:22:04,900 INFO  [org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator] (MSC service thread 1-3) HHH000130: Instantiating explicit connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider19:22:04,913 INFO  [org.hibernate.dialect.Dialect] (MSC service thread 1-3) HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect19:22:04,917 INFO  [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (MSC service thread 1-3) HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory19:22:04,919 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (MSC service thread 1-3) HHH000397: Using ASTQueryTranslatorFactory19:22:04,931 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000228: Running hbm2ddl schema update19:22:04,932 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000102: Fetching database metadata19:22:05,993 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000396: Updating schema19:22:06,011 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC service thread 1-3) HHH000261: Table found: U1.STUDENT19:22:06,013 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC service thread 1-3) HHH000037: Columns: [id, birthday, age, name]19:22:06,014 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC service thread 1-3) HHH000108: Foreign keys: []19:22:06,015 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC service thread 1-3) HHH000126: Indexes: [sys_c0010798]19:22:06,016 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000232: Schema update complete19:22:06,189 INFO  [org.jboss.web] (MSC service thread 1-2) JBAS018210: Registering web context: /HelloWorld19:22:06,660 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS018559: Deployed "HelloWorld.jar"




最终的客户端调用代码

package com.undergrowth.ejb3.client;import java.util.Date;import java.util.Hashtable;import java.util.List;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;import com.undergrowth.bean.Student;import com.undergrowth.hello.StudentService;/** * 获取EJB服务 对Student对象进行CRUD操作 * @author Administrator * */public class StudentClient {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry {StudentService ss=lookupRemoteHelloWorldBean();//student的CRUD操作System.out.println("添加前查询");//R  查询List<Student> liStudents=ss.getAllStudents();for (Student student2 : liStudents) {System.out.println(student2);}Student student=initStudent();//C  添加ss.save(student);System.out.println("添加后查询");//R  查询liStudents=ss.getAllStudents();for (Student student2 : liStudents) {System.out.println(student2);}//U  更新student=ss.getById(5);student.setNAME("Eason");ss.update(student);System.out.println("更新后查询");//R   查询liStudents=ss.getAllStudents();for (Student student2 : liStudents) {System.out.println(student2);}//D    删除ss.delete(6);System.out.println("删除后查询");//R    查询liStudents=ss.getAllStudents();for (Student student2 : liStudents) {System.out.println(student2);}} catch (NamingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 初始化操作 * @return */private static Student initStudent() {Student student=new Student();student.setNAME("华仔");student.setAge(56);student.setBirthday(new Date());return student;}/** * 在jboss中查找到jndi里发布的服务 * @return * @throws NamingException */public static StudentService lookupRemoteHelloWorldBean() throws NamingException {        final Hashtable jndiProperties = new Hashtable();        jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");        final Context context = new InitialContext(jndiProperties);        // The app name is the application name of the deployed EJBs. This is typically the ear name        // without the .ear suffix. However, the application name could be overridden in the application.xml of the        // EJB deployment on the server.        // Since we haven't deployed the application as a .ear, the app name for us will be an empty string        final String appName = "";        // This is the module name of the deployed EJBs on the server. This is typically the jar name of the        // EJB deployment, without the .jar suffix, but can be overridden via the ejb-jar.xml        // In this example, we have deployed the EJBs in a jboss-as-ejb-remote-app.jar, so the module name is        // jboss-as-ejb-remote-app        final String moduleName = "HelloWorld";        // AS7 allows each deployment to have an (optional) distinct name. We haven't specified a distinct name for        // our EJB deployment, so this is an empty string        final String distinctName = "";        // The EJB name which by default is the simple class name of the bean implementation class        final String beanName = "StudentServiceBean";        // the remote view fully qualified class name       // final String viewClassName = HelloWorldRemote.class.getName();        final String viewClassName = StudentService.class.getName();        // let's do the lookup        return (StudentService) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);         }}

控制台输出

十月 29, 2014 7:43:36 下午 org.jboss.ejb.client.EJBClient <clinit>INFO: JBoss EJB Client version 1.0.5.Final添加前查询十月 29, 2014 7:43:36 下午 org.xnio.Xnio <clinit>INFO: XNIO Version 3.0.3.GA十月 29, 2014 7:43:36 下午 org.xnio.nio.NioXnio <clinit>INFO: XNIO NIO Implementation Version 3.0.3.GA十月 29, 2014 7:43:36 下午 org.jboss.remoting3.EndpointImpl <clinit>INFO: JBoss Remoting version 3.2.3.GA十月 29, 2014 7:43:37 下午 org.jboss.ejb.client.remoting.VersionReceiver handleMessageINFO: Received server version 1 and marshalling strategies [river]十月 29, 2014 7:43:37 下午 org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associateINFO: Successful version handshake completed for receiver context EJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@7b745a, receiver=Remoting connection EJB receiver [connection=Remoting connection <19dc72f>,channel=jboss.ejb,nodename=win-2nh7bqab7hp]} on channel Channel ID f4e2973a (outbound) of Remoting connection 00cfd5ee to localhost/127.0.0.1:4447十月 29, 2014 7:43:37 下午 org.jboss.ejb.client.remoting.ChannelAssociation$ResponseReceiver handleMessageWARN: Unsupported message received with header 0xffffffffStudent [id=5, NAME=华仔, birthday=2014-10-29, age=56]Student [id=6, NAME=华仔, birthday=2014-10-29, age=56]添加后查询Student [id=5, NAME=华仔, birthday=2014-10-29, age=56]Student [id=6, NAME=华仔, birthday=2014-10-29, age=56]Student [id=7, NAME=华仔, birthday=2014-10-29, age=56]更新后查询Student [id=5, NAME=Eason, birthday=2014-10-29, age=56]Student [id=6, NAME=华仔, birthday=2014-10-29, age=56]Student [id=7, NAME=华仔, birthday=2014-10-29, age=56]删除后查询Student [id=5, NAME=Eason, birthday=2014-10-29, age=56]Student [id=7, NAME=华仔, birthday=2014-10-29, age=56]十月 29, 2014 7:43:37 下午 org.jboss.ejb.client.remoting.ChannelAssociation$ResponseReceiver handleEndINFO: Channel Channel ID f4e2973a (outbound) of Remoting connection 00cfd5ee to localhost/127.0.0.1:4447 can no longer process messages



即完成实体Bean的CRUD操作   

哦 jboss的jndi连接服务器参数文件  在src下 jboss-ejb-client.properties

endpoint.name=client-endpoint  remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false     remote.connections=default     remote.connection.default.host= localhostremote.connection.default.port = 4447remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false    remote.connection.default.username=qq     remote.connection.default.password=q  



记录学习的脚步

0 0
原创粉丝点击