복붙노트

[SPRING] weblogic을 이용한 Hibernate를 이용한 트랜잭션 관리

SPRING

weblogic을 이용한 Hibernate를 이용한 트랜잭션 관리

우리의 어플리케이션은 weblogic에 배치됩니다.

우리는 최대 절전 모드와 봄을 사용한다.

세션 팩토리는 hibernate.cfg.xml 파일을 읽어 SessionFactories를 생성하는 사용자 정의 클래스를 통해 생성된다.

그래서 이것은 다음과 같은 단계입니다. 우리의 커스텀 클래스는 스프링 애플리케이션 컨텍스트에 정의되어 있으며이 클래스 생성자에 CFG XML 파일의 형식을 주입한다.

<bean id="myCustomFactoryCreator"
    class="com.xyz.CustomFactoryCreator"
    singleton="true">
    <constructor-arg>
        <bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" >
            <property name="staticField">
                <value>com.xyz.MyConstants.HIBERNATE_CFG_XML</value>
            </property>
        </bean>
    </constructor-arg>
</bean> 

MyConstants.java :

public static final String HIBERNATE_CFG_XML = ".hibernate.cfg.xml";

그래서 생성자에서 이런 식으로 - 코드는 ".hibernate.cfg.xml"로 끝나는 모든 파일을 반복합니다. 나는 다른 클라이언트를 위해 다른 파일을 가질 것이다 : "Client1.hibernate.cfg.xml"및 "Client2.hibernate.cfg.xml"등등 ......

코드는 이러한 모든 파일을 반복하고 SessionFactories를 생성 한 다음 HibernateTemplate 스프링에 임베드 한 다음 키 값 쌍으로 클라이언트 이름에 대한 맵에 저장합니다. 즉 Client1, HibernateTemplate1 Client2, HibernateTemplate2 등등 네가 그림을 가져 오기를 바란다.

이 콩 "myCustomFactoryCreator"는 다음 내 Dao에 주입됩니다 :

<bean id="myCustomDao"
    class="com.xyz.MyCustomDao"
    lazy-init="true">
    <property name="criteriaConverter" ref="criteriaConverter" />
    <property name="myFactory" ref="myCustomFactoryCreator" />
</bean>

내 Hibernate.cfg.xml의 예는 다음과 같습니다. (각 클라이언트마다 스키마 이름이 변경되는 파일이 여러 개 있습니다.)

<hibernate-configuration>
<session-factory>
    <property name="connection.datasource">MYDS</property>
    <property name="show_sql">true</property>
    <property name="default_schema">CLIENT1SCHEMA</property>
</session-factory>

내 Dao에서 - 클라이언트 로그인을 기반으로 - 적절한 HibernateTemplate을 얻고 데이터베이스에 대해 fire를 선택한다. 여기서 우리는 "DetachedCriteria"를 사용하고 있습니다 - 샘플 코드는 다음과 같습니다 :

List<T> inObjList=HibernateTemplate.findByCriteria(DetachedCriteria, 0, 100);

그럼이게 다 괜찮아요. 이것은 우리가 4.x 이전에 Hibernate를 사용했을 때였습니다.

지금까지 인내심을 가져 주셔서 감사합니다. 이제 문제가 발생합니다. Hibernate 4.x 사용 - 더 이상 Spring Hibernate Template을 사용할 수 없다. 비록 내가 그것을 사용할 수있는 방법이있다해도 - 내 통제를 벗어나는 이유들 때문에 나는 그것을 사용할 수 없게 될 것이다 - 그래서 SessionFactory 경로를 가야한다.

그래서 위와 같은 논리를 따라 - 나는 HibernateTemplate을 저장하는 것에 대비하여 clientName과 SessionFactory 맵에 저장했다.

차이점은 이제 더 이상 사용할 수 없다는 것입니다. - HibernateTemplate.findByCriteria () 그래서 저는 SessionFactory를 맵에서 얻은 다음 세션을 얻으려고했습니다.

Session session=testSessionFactory.getCurrentSession();

위의 줄에있는 오류와 함께 실패했습니다. 예외는 다음과 같습니다.

그래서 약간의 인터넷 검색 및 stackoverflow에서 솔루션을보고 않았다 - 내 CFG 파일에 다음 줄을 추가 할 - 100 % 확실하지 않은 경우 그것은 내 관리 환경을 내가 사용하는 weblogic 관리되는 datasource JTA가 될 것입니다.

<property name="hibernate.current_session_context_class">jta</property>

이것은 첫 번째 예외에 의해 나를 잡았습니다 -하지만 두 번째 예외가 발생했습니다 :

다음 코드 줄에서

저는 겸손한 jdbc 세계에서 왔기 때문에 아무런 문제도 생각하지 않았습니다. 코드에 트랜잭션 ala jdbc를 추가하기 만하면됩니다.

Transaction tx = null;
session.beginTransaction();
Criteria subSelectCriteria =session.createCriteria(getType());
tx.commit();

위의 커밋에서 오류가 발생하여 실패했습니다.

Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
at org.hibernate.engine.tx.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:116)
at org.hibernate.engine.tx.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180)
Caused by: java.sql.SQLException: Cannot call Connection.commit in distributed transaction.  
Transaction Manager will commit the resource manager when the distributed tx is committed.
at weblogic.jdbc.wrapper.JTSConnection.commit(JTSConnection.java:663)

그럼 내 Hibernate CFG 파일에서 다음 줄을 추가하고 Dao에서 Java 코드의 트랜잭션 관리를 제거했습니다.

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>

이로 인해 오류가 발생했습니다.

org.hibernate.HibernateException: No TransactionManagerLookup specified

그래서 내가해야 할 일을 조언 해주세요. 그리고 긴 게시물에 나와 함께 견뎌 주셔서 감사합니다.

NOTE - 나는 Spring에서 각 SessionFactory를 bean으로 정의 할 수있는 솔루션을 찾고이를 각각의 Session에 넣었다.

그러나 그것은 각 SessionFactory에 대해 내가 수동으로 빈을 정의하고 HibernateTransactinManager를 주입 할 필요가 있음을 의미 할 것이다.

고맙습니다 !

해결법

    from https://stackoverflow.com/questions/27344393/transaction-management-using-hibernate-with-weblogic by cc-by-sa and MIT license