• 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  



    记录学习的脚步

  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/liangxinzhi/p/4275553.html
Copyright © 2020-2023  润新知