Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Проблема с Hibernate as JPA provider in weblogiс10


Автор: alexadr 31.7.2008, 12:06
Все добрый день.

Пытаюсь прикрутить гибернейт в качестве JPA провайдера для EJB30 под weblogic10. И у меня при этом возникают проблемы с транзакциями. Я пытаюсь добится того чтобы гибернейтовский EntityManager использовал уже имеющуюся транзакцию, но этого у меня не получается. Попытаюсь более подробно пояснить кодом.

Есть тестовый модуль, состоящий из:
- одного Entity бина(мапит талицу из двух полей)
- одного Session бина. У данного бина два метода. В одном методе происходит создание нового Entity бина, а в вторым методом проверяю, добавлась ли запись в БД. Соответственно у сесионного бина - @TransactionAttribute(TransactionAttributeType.REQUIRED). Т.е. по идее при дергании метода бина, - транзакция уже есть.
Итак сам код:

Entity Bean:
Код

package test.entity; 

import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.Id; 
import javax.persistence.Column; 

@Entity 
@Table(name = "TEST_ENTITY") 
public class EntityTest { 

    @Id 
    @Column(name = "ID") 
    private Integer id; 

    @Column(name = "NAME") 
    private String name; 


    public Integer getId() { 
        return id; 
    } 

    public void setId(Integer id) { 
        this.id = id; 
    } 

    public String getName() { 
        return name; 
    } 

    public void setName(String name) { 
        this.name = name; 
    } 

    public boolean equals(Object o) { 
        if (this == o) return true; 
        if (o == null || getClass() != o.getClass()) return false; 

        final EntityTest review = (EntityTest) o; 

        return id.equals(review.id); 
    } 

    public int hashCode() { 
        return id; 
    } 

} 


Session Bean:
Код

package test.second; 

import test.entity.EntityTest; 

import javax.ejb.Stateless; 
import javax.ejb.TransactionAttribute; 
import javax.ejb.TransactionAttributeType; 
import javax.persistence.PersistenceContext; 
import javax.persistence.EntityManager; 
import java.util.List; 

@Stateless(name = "SessFacadEJB", mappedName = "second") 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public class SessFacadBean implements SessFacad{ 

    @PersistenceContext(unitName = "pointBaseDemoUnit_For_Second") 
    EntityManager em; 

    public SessFacadBean() { 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void testEntity() { 
        List result = em.createQuery("select x from EntityTest x").getResultList(); 
        int i = 1; 
        for (Object o : result) { 
            EntityTest et = (EntityTest) o; 
            System.out.println("id[" + et.getId() + "] name[" + et.getName() + "]"); 
            i++; 
        } 

        EntityTest newEt = new EntityTest(); 
        newEt.setId(i); 
        newEt.setName("Test_Name_" + i); 
        em.persist(newEt); 

        System.out.println("Entity with id: " + i + "added"); 
    } 

    public int checkAdding() { 
        Integer result = (Integer) em.createQuery("select max (x.id ) from EntityTest x").getSingleResult(); 
        System.out.println("Max id: " + result); 
        return result; 
    } 
} 


И 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_1_0.xsd" 
             version="1.0"> 
    <persistence-unit name="pointBaseDemoUnit_For_Second" transaction-type="JTA"> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <jta-data-source>demo.pointbase.datasource</jta-data-source> 
        <class>test.entity.EntityTest</class> 
        <properties> 
            <property name="hibernate.dialect" value="org.hibernate.dialect.PointbaseDialect"/> 
            <property name="show_sql" value="true"/> 
            <property name="hibernate.transaction.manager_lookup_class"    value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/> 
            <property name="hibernate.transaction.factory_class"           value="org.hibernate.transaction.CMTTransactionFactory"/> 
            <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/> 
        </properties> 
    </persistence-unit> 
</persistence> 


В общем я дергаю метод testEntity(). После этого проверяю методом checkAdding(), добавилась ли запись в таблицу. Но увы, запись при использовании гибернейт-провайдера не добавляется.
Как только я использую default провайдер для weblogic10(Open JPA Provider):
Код

<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_1_0.xsd" 
             version="1.0"> 
    <persistence-unit name="pointBaseDemoUnit_For_Seconf" transaction-type="JTA"> 
        <jta-data-source>demo.pointbase.datasource</jta-data-source> 
    </persistence-unit> 
</persistence> 

То у меня тут же все начинает корректно работать.

Честно говоря я зашел тут в тупик, т.к. вроде проверил все возможные варианты, заставить работать гибернейтовский провайдер у меня так и не получилось.
У меня есть подозрение, что возможно я как то не так добавил гибернейтовский библиотеки или добавли но не все. В общем добали я их так:
В папку lib, которая находится в корневой дирректории weblogic домена я положил все либы для гибернейта(weblogic говорит что он их от туда подгружает при старте сервера). В общем список либов такой:
antlr-2.7.6.jar
asm-attrs.jar
asm.jar
cglib-2.1.3.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
hibernate-annotations.jar (3.3.1.GA)
hibernate-commons-annotations.jar (3.0.0.GA)
hibernate-entitymanager.jar (3.3.2.GA)
hibernate3.jar (3.2.6.ga)
javassist.jar

Я проверил по Compatibility Matrix на сайте гибернейта(http://hibernate.org/6.html), вроде все нормально.

В общем вот такая вот проблема...

Автор: Kangaroo 31.7.2008, 14:45
Цитата(alexadr @  31.7.2008,  12:06 Найти цитируемый пост)
В общем я дергаю метод testEntity(). После этого проверяю методом checkAdding(), добавилась ли запись в таблицу. Но увы, запись при использовании гибернейт-провайдера не добавляется.

А в логах что-нибудь интересное есть?

Автор: alexadr 1.8.2008, 11:48
Да, вот честно говоря логи я еще не прикручивал, решил для тестового примера ограничится System.out-ми. В консоли  при этом ничего интересного. Попробую прикрутить логи.

Автор: alexadr 1.8.2008, 13:44
2 Kangaroo 
Эх, было бы 100 постов, добавил бы плюсик, а пока просто спасибо. Совет был прямо в точку.
Логи гибернейта сказали:
Код

2008.08.01-13:17:05,947 WARN  AbstractEntityManagerImpl : Cannot join transaction: do not override hibernate.transaction.factory_class


Поэтому просто поправил 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_1_0.xsd" 
             version="1.0"> 
    <persistence-unit name="pointBaseDemoUnit_For_Second" transaction-type="JTA"> 
        <provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <jta-data-source>demo.pointbase.datasource</jta-data-source> 
        <class>test.entity.EntityTest</class> 
        <properties> 
            <property name="hibernate.dialect" value="org.hibernate.dialect.PointbaseDialect"/> 
            <property name="show_sql" value="true"/> 
            <property name="hibernate.transaction.manager_lookup_class"    value="org.hibernate.transaction.WeblogicTransactionManagerLookup"/> 
            <property name="hibernate.query.factory_class" value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory"/> 
        </properties> 
    </persistence-unit> 
</persistence> 


и все тут же заработало.

Автор: Kangaroo 1.8.2008, 15:06
Цитата(alexadr @  1.8.2008,  13:44 Найти цитируемый пост)
пока просто спасибо. Совет был прямо в точку.

Не за что  smile 
Пометь только тему решенной (справа сверху).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)