[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - Trivial Hibernate example with EJB3 and Hibernate, but trans
smithmb
do-not-reply at jboss.com
Thu Jan 10 17:17:05 EST 2008
Hello folks,
I'm trying to create a trivial example of a transaction working correctly with MySQ L5.0.x and local-tx-datasource and Connector/J 3.x. I'm using Hibernate and EJB3, and JBoss 4.0.x. I cannot get transactions to rollback w/ SessionContext.setRollbackOnly() OR by throwing an uncaught EJB/Runtime exception.
Rolling back via the mysql command line client works great, and the tables in question are InnoDB.
Here is my documentation of the problem -- I'd love it if anyone can tell me anything that looks weird. Please help -- this is so trivial it SHOULD work!
mysql-ds.xml:
| <?xml version="1.0" encoding="UTF-8"?>
| <datasources>
| <local-tx-datasource>
| <jndi-name>MySqlDS</jndi-name>
| <connection-url>jdbc:mysql://127.0.0.1:3306/scheduler_db</connection-url>
| <driver-class>com.mysql.jdbc.Driver</driver-class>
| <user-name>censored</user-name>
| <password>censored</password>
| <metadata>
| <type-mapping>mySQL</type-mapping>
| </metadata>
| </local-tx-datasource>
| </datasources>
|
persistence.xml:
| <persistence>
| <persistence-unit name="persistence-unit">
| <jta-data-source>java:/MySqlDS</jta-data-source>
| <properties>
| <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
| <property name="hibernate.connection.release_mode" value="auto"/>
| <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
| </properties>
| </persistence-unit>
| </persistence>
|
My EJB3 session bean:
| @Stateless
| public class TestBean implements TestBeanLocal, TestBeanRemote
| {
|
| @PersistenceContext(name = "persistence-unit")
| EntityManager em;
|
| @Resource
| SessionContext ctx;
|
| public static final String RemoteJNDIName = "example/" + TestBean.class.getSimpleName() + "/remote";
| public static final String LocalJNDIName = "example/" + TestBean.class.getSimpleName() + "/local";
|
| @TransactionAttribute(TransactionAttributeType.REQUIRED)
| public void test()
| {
| Book book = new Book(null, "My first book", "Person 1");
| em.persist(book);
|
| Book book2 = new Book(null, "My second book", "Person 2");
| em.persist(book2);
|
| System.out.println("CURRENT TRANSACTION STATUS 1: " + (ctx.getRollbackOnly() ? "ROLLBACK" : "NOT ROLLBACK"));
| ctx.setRollbackOnly();
| System.out.println("CURRENT TRANSACTION STATUS 2: " + (ctx.getRollbackOnly() ? "ROLLBACK" : "NOT ROLLBACK"));
|
| Book book3 = new Book(null, "My third book", "Person 3");
| em.persist(book3);
|
| List someBooks = em.createQuery("from Book").getResultList();
|
| for (Iterator iter = someBooks.iterator(); iter.hasNext();)
| {
| Book element = (Book) iter.next();
| em.remove(element);
| }
| }
|
My test client:
| public static void main(String[] args) throws Exception
| {
| Properties properties = new Properties();
| properties.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
| properties.put("java.naming.factory.url.pkgs", "=org.jboss.naming:org.jnp.interfaces");
| properties.put("java.naming.provider.url", "localhost:1099");
| Context context = new InitialContext(properties);
|
| TestBeanRemote beanRemote = (TestBeanRemote) context.lookup(TestBean.RemoteJNDIName);
| beanRemote.test();
| }
|
Output log from JBoss:
| 2008-01-10 17:15:40,755 DEBUG [org.jboss.remoting.transport.socket.ServerThread] WAKEUP in SERVER THREAD
| 2008-01-10 17:15:40,991 DEBUG [org.jboss.remoting.transport.socket.ServerThread] beginning dorun
| 2008-01-10 17:15:41,211 DEBUG [org.hibernate.impl.SessionImpl] opened session at timestamp: 4915213685571584
| 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join
| 2008-01-10 17:15:41,211 DEBUG [org.hibernate.jdbc.JDBCContext] successfully registered Synchronization
| 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Looking for a JTA transaction to join
| 2008-01-10 17:15:41,211 DEBUG [org.hibernate.ejb.AbstractEntityManagerImpl] Transaction already joined
| 2008-01-10 17:15:41,220 DEBUG [org.hibernate.event.def.AbstractSaveEventListener] executing identity-insert immediately
| 2008-01-10 17:15:41,224 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
| 2008-01-10 17:15:41,224 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection
| 2008-01-10 17:15:41,352 DEBUG [org.hibernate.SQL] insert into book (title, author) values (?, ?)
| 2008-01-10 17:15:41,420 DEBUG [org.hibernate.id.IdentifierGeneratorFactory] Natively generated identity: 1
| 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
| 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection
| 2008-01-10 17:15:41,420 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
| 2008-01-10 17:15:41,420 DEBUG [org.hibernate.event.def.AbstractSaveEventListener] executing identity-insert immediately
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] opening JDBC connection
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.SQL] insert into book (title, author) values (?, ?)
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.id.IdentifierGeneratorFactory] Natively generated identity: 2
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC connection
| 2008-01-10 17:15:41,421 DEBUG [org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
| 2008-01-10 17:15:41,421 INFO [STDOUT] CURRENT TRANSACTION STATUS 1: NOT ROLLBACK
| 2008-01-10 17:15:41,422 INFO [STDOUT] CURRENT TRANSACTION STATUS 2: ROLLBACK
| 2008-01-10 17:15:41,422 DEBUG [org.jboss.ejb3.entity.ManagedEntityManagerFactory] ************** closing entity managersession **************
| 2008-01-10 17:15:41,447 DEBUG [org.jboss.remoting.transport.socket.ServerThread] begin thread wait
|
Book.java (the hibernate entity):
| @Entity
| @Table(name = "book")
| @SequenceGenerator(name = "book_sequence", sequenceName = "book_id_seq")
| public class Book implements Serializable
| {
| /**
| *
| */
| private static final long serialVersionUID = -9108127436362270765L;
| private Integer id;
| private String title;
| private String author;
|
| public Book()
| {
| super();
| }
|
| public Book(Integer id, String title, String author)
| {
| super();
| this.id = id;
| this.title = title;
| this.author = author;
| }
|
| @Override
| public String toString()
| {
|
| return "Book: " + getId() + " Title " + getTitle() + " Author " + getAuthor();
| }
|
| /**
| * @return the author
| */
| public String getAuthor()
| {
| return author;
| }
|
| /**
| * @param author the author to set
| */
| public void setAuthor(String author)
| {
| this.author = author;
| }
|
| /**
| * @return the id
| */
| @Id
| @GeneratedValue(strategy = GenerationType.AUTO, generator = "book_sequence")
| public Integer getId()
| {
| return id;
| }
|
| /**
| * @param id the id to set
| */
| public void setId(Integer id)
| {
| this.id = id;
| }
|
| /**
| * @return the title
| */
| public String getTitle()
| {
| return title;
| }
|
| /**
| * @param title the title to set
| */
| public void setTitle(String title)
| {
| this.title = title;
| }
|
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4118862#4118862
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4118862
More information about the jboss-user
mailing list