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,文件内容如下:
#4.进入jboss-as-7.1.1.Final\standalone\configuration,打开standalone.xml文件:
找到 <datasources>标签,里面应该已经有一个默认的datasource:ExampleDS,现在加入我们的mysql的datasource:
接下来,在drivers中加入mysql的driver
启动jboss,看到数据源配置成功。
二、测试代码。
1)EJB的事务管理分如下两个方面:
1、CMT(容器管理事务)
2、BMT(Bean管理事务)
本次用CMT做实验。
2)建表sql
3)Person Bean
4)PersonService接口与实现类
5)persistence.xml
文件放在这里,注意jta-data-source属性,与上面standalone.xml配置的数据源jndi名称一致
6)端口要保持一致
三、测试方法
Junit调用testSave方法进行实验。
附上我的源码,传送门:
http://download.csdn.net/detail/nk_tf/9692886
#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
相关文章推荐
- 如何获得Spring容器里管理的Bean,。不论是Service层,还是实体Dao层
- EJB 学习笔记之 -实体Bean
- EJB OneToOne 实体BEAN sessionBean 客户端 演示
- Eclipse快速上手EJB -- 2. 设计一个实体Bean
- EJB 3.0 开发指南之实体Bean(二)
- EJB--实体Bean
- EJB---->实体bean的属性映射
- EJB3.0开发指南:实体Bean的继承:每类一表策略
- TransactionProxyFactoryBean代理事务-开放式事物管理
- EJB3.0开发指南:实体Bean的继承:联合表策略
- 1.3.4 考虑使用EJB实体Bean
- EJB---->实体bean
- EJB3.0开发指南:实体Bean的继承:单一表策略
- Myeclipse结合mysql和Jboss的EJB实体bean实例
- EJB 自动生成实体BEAN
- EJB3.0之实体Bean的继承
- EJB---->实体bean
- EJB3.0开发指南:使用实体Bean
- EJB实体Bean如何和数据库中表关联?
- ejb3的实体bean管理类EntityManager常用API