EJB實體Bean與事物管理

一、jboss7.1.1配置mysql數據源

#1.到http://www.mysql.com/downloads/connector/j/下載MySQL的驅動包

#2.進入jboss-as-7.1.1.Final\modules\com目錄下,建立文件夾mysqldatabase\mysql\main

#3.將mysql-connector-Java-5.1.24-bin.jar複製到main文件夾下,並加入module.xml,文件內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mysqldatabase.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.24-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="javax.servlet.api" optional="true"/>
</dependencies>
</module>

#4.進入jboss-as-7.1.1.Final\standalone\configuration,打開standalone.xml文件:

找到 <datasources>標籤,裏面應該已經有一個默認的datasource:ExampleDS,現在加入我們的mysql的datasource:

<datasource jndi-name="java:jboss/datasources/MySqlDS" pool-name="MySqlDS" enabled="true" use-java-context="true">
	<connection-url>jdbc:mysql://localhost:3306/jbossdb</connection-url>
        <driver>mysql</driver>
        <security>
        	<user-name>root</user-name>
        	<password>root</password>
	</security>
</datasource>

接下來,在drivers中加入mysql的driver

          <drivers>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                    <driver name="mysql" module="com.mysqldatabase.mysql">
                        <driver-class>com.mysql.jdbc.Driver</driver-class>
                        <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
                    </driver>
            </drivers>


啓動jboss,看到數據源配置成功。


二、測試代碼。

1)EJB的事務管理分如下兩個方面:
1、CMT(容器管理事務)
2、BMT(Bean管理事務)
本次用CMT做實驗。

2)建表sql

DROP TABLE IF EXISTS `jbossdb`.`person`;
CREATE TABLE  `jbossdb`.`person` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3)Person Bean

package com.neil.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 static final long serialVersionUID = 1499476398817334148L;
	private int id;
	private String name;

	public Person() {
	}

	public Person(String name) {
		this.name = name;
	}

	@Id @Column(name="id") @GeneratedValue(strategy=GenerationType.AUTO)
	public int getId() {
		return id;
	}

	public void setId(int 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;
		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 != other.id)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + "]";
	}

}

4)PersonService接口與實現類

package com.neil.service;
import java.util.List;

import com.neil.bean.Person;
public interface PersonService {
	void save();
	void delete(int id);
	void update(Person person);
	List<Person> getAllPerson();
	void syout(String string);
	Person getById(int id);
}

package com.neil.service.impl;

import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.neil.bean.Person;
import com.neil.service.PersonService;

@Stateless
@Remote(PersonService.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
// 這裏來定義是CMT還是BMT
public class PersonServiceBean implements PersonService {
	@PersistenceContext(unitName = "testUnit")
	EntityManager em;

	@Resource
	private SessionContext context;

	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public void save() {
		em.persist(new Person("test1"));
		em.persist(new Person("test2"));
		System.out.println("================================" + getAllPerson());
		// em.persist(new Person(null));
		try {
			if (1==9) {
				throw new IOException("IO異常");
			}
			em.persist(new Person("test3"));
		} catch (Exception e) {
//			context.setRollbackOnly();
			// TODO Auto-generated catch block
//			e.printStackTrace();
		}
		System.out.println("================================" + getAllPerson());
	}

	@Override
	public void delete(int id) {
		em.remove(em.getReference(Person.class, id));
	}

	@Override
	public void update(Person person) {
		em.merge(person);
	}

	@Override
	public List<Person> getAllPerson() {
		return em.createQuery("select o from Person o").getResultList();
	}

	@Override
	public void syout(String string) {
		System.out.println(string);
	}

	@Override
	public Person getById(int id) {
		return em.find(Person.class, id);
	}

}

5)persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="testUnit" >
<jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>
<properties>
<!-- <property name="hibernate.hbm2ddl.auto" value="create-drop"/> -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>

文件放在這裏,注意jta-data-source屬性,與上面standalone.xml配置的數據源jndi名稱一致


6)端口要保持一致




三、測試方法

package com.neil.service.test;

import static org.junit.Assert.fail;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.junit.BeforeClass;
import org.junit.Test;

import com.neil.bean.Person;
import com.neil.service.PersonService;
import com.neil.service.impl.PersonServiceBean;

public class PersonServiceTest {
	private static PersonService personService;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		try {
			Properties jndiProperties = new Properties();
			jndiProperties.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");// 讓JNDI
																						// API知道是由誰來管理我們用來查找JNDI
																						// 名字的命名空間的。
			Context context = new InitialContext(jndiProperties);
			// appName 和 moduleName分別就打包的格式而定
			// 如果是.ear就是appName,其它的是moduleName(.jar,.war)
			String appName = "";
			String moduleName = "EntityBean";
			String distinctName = "";
			// 實現類名
			String beanName = PersonServiceBean.class.getSimpleName();
			System.out.println("bean==="+beanName);
			// 接口類名
			String viewClassName = PersonService.class.getName();
			System.out.println("class==="+viewClassName);
//			String jndi = "app/EntityBean/PersonServiceBean!com.neil.service.PersonService";
			String jndi = "ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!"
					+ viewClassName;
			System.out.println(jndi);
			personService = (PersonService) context.lookup(jndi);
			System.out.println("personService------->"+personService);
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Test
	public void testSave() {
		personService.save();
	}

	@Test
	public void testDelete() {
//		personService.delete(4);
//		personService.delete(5);
	}

	@Test
	public void testUpdate() {
		Person person = personService.getById(1);
		person.setName("Nick");
		personService.update(person);
	}

	@Test
	public void testGetAllPerson() {
		System.out.println("================================"+personService.getAllPerson());
	}

}

 Junit調用testSave方法進行實驗。

附上我的源碼,傳送門:

http://download.csdn.net/detail/nk_tf/9692886













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章