您的位置:首页 > 其它

EJB实体Bean与事物管理

2016-11-24 21:46 441 查看
一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: