zoukankan      html  css  js  c++  java
  • JBOSS7搭载EJB3之实体Bean

      实体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;
    	
    	@Override
    	public void save(Student student) {
    		// TODO Auto-generated method stub
    		//由新建状态转为托管状态
    		em.persist(student);
    	}
    
    	@Override
    	public void delete(Integer id) {
    		// TODO Auto-generated method stub
    		//有托管状态转为销毁状态
    		em.remove(getReferencesById(id));
    	}
    
    	@Override
    	public void update(Student student) {
    		// TODO Auto-generated method stub
    		//由游离态转为托管状态
    		em.merge(student);
    	}
    
    	@Override
    	public Student getById(Integer id) {
    		// TODO Auto-generated method stub
    		return em.find(Student.class, id);
    	}
    
    	@SuppressWarnings("unchecked")
    	@Override
    	public List<Student> getAllStudents() {
    		// TODO Auto-generated method stub
    		//使用JPQL进行查询结果集
    		return (List<Student>)em.createQuery("select s from Student s").getResultList();
    	}
    
    	@Override
    	public 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;
    	@Column
    	private 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;
    	}
    	@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;
    		Student other = (Student) obj;
    		if (id == null) {
    			if (other.id != null)
    				return false;
    		} else if (!id.equals(other.id))
    			return false;
    		return true;
    	}
    	@Override
    	public 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}uild"  />
    
        <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.StudentService
    	java:app/HelloWorld/StudentServiceBean!com.undergrowth.hello.StudentService
    	java:module/StudentServiceBean!com.undergrowth.hello.StudentService
    	java:jboss/exported/HelloWorld/StudentServiceBean!com.undergrowth.hello.StudentService
    	java:global/HelloWorld/StudentServiceBean
    	java:app/HelloWorld/StudentServiceBean
    	java: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=WebServicesEjbTestBean
    19:22:04,889 INFO  [org.jboss.as.ejb3] (MSC service thread 1-2) JBAS014142: Started message driven bean 'JmsMessageConsumer' with 'hornetq-ra' resource adapter
    19: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.InjectedDataSourceConnectionProvider
    19:22:04,913 INFO  [org.hibernate.dialect.Dialect] (MSC service thread 1-3) HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
    19:22:04,917 INFO  [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (MSC service thread 1-3) HHH000268: Transaction strategy: org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory
    19:22:04,919 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (MSC service thread 1-3) HHH000397: Using ASTQueryTranslatorFactory
    19:22:04,931 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000228: Running hbm2ddl schema update
    19:22:04,932 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000102: Fetching database metadata
    19:22:05,993 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (MSC service thread 1-3) HHH000396: Updating schema
    19:22:06,011 INFO  [org.hibernate.tool.hbm2ddl.TableMetadata] (MSC service thread 1-3) HHH000261: Table found: U1.STUDENT
    19: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 complete
    19:22:06,189 INFO  [org.jboss.web] (MSC service thread 1-2) JBAS018210: Registering web context: /HelloWorld
    19: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 stub
    		try {
    			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 block
    			e.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 handleMessage
    INFO: Received server version 1 and marshalling strategies [river]
    十月 29, 2014 7:43:37 下午 org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associate
    INFO: 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 handleMessage
    WARN: Unsupported message received with header 0xffffffff
    Student [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 handleEnd
    INFO: 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= localhost
    remote.connection.default.port = 4447
    remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false  
      
    remote.connection.default.username=qq     
    remote.connection.default.password=q  



    记录学习的脚步

  • 相关阅读:
    Android与互联网的交互方式有三种
    Android 本地tomcat服务器接收处理手机上传的数据之案例演示
    Android 本地tomcat服务器接收处理手机上传的数据之环境搭建
    win7 查看当前java路径
    Android 使用tomcat搭建HTTP文件下载服务器
    Android 本地搭建Tomcat服务器供真机测试
    Android org.apache.http.*找不到
    Android IndicatorSeekBar
    Volley overview
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error(Sqlite code 14): Could not open database,(OS error
  • 原文地址:https://www.cnblogs.com/liangxinzhi/p/4275553.html
Copyright © 2011-2022 走看看