2011-09-28 2 views
0

나는 followgin 구성 파일을 가지고 있으며 최대 절전 모드 세션을 가져 오는 동안 다음 예외가 발생합니다. hibernate.cfg.xml에 문제가 있거나 누락 된 속성이 있습니까?weblogic (10.3.4) 콘솔의 이상한 최대 절전 모드

의 persistence.xml

<persistence version="2.0" 
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_2_0.xsd"> 

<persistence-unit name="test" transaction-type="JTA"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<jta-data-source>test-ds</jta-data-source> 

<properties> 
    <property name="hibernate.jndi.url" value="t3://127.0.0.1:7001" /> 
    <property name="hibernate.connection.datasource" value="test-ds" /> 
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WeblogicTransactionManagerLookup" /> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
    <property name="hibernate.hbm2ddl.auto" value="update" /> 
    <property name="hibernate.current_session_context_class" value="jta" /> 
</properties> 

<!-- For WebLogic AppSer. --> 
<class>test.model.BaseEntity</class> 
<class>test.model.InvoiceDetail</class> 
<class>test.model.InvoiceMovement</class> 
<class>test.model.InvoicePaymentItem</class> 
<class>test.model.Job</class> 
<class>test.model.Member</class> 

</persistence-unit> 


나는 또한 웹 로직 구성 파일의 클래스 경로 jpa2.0 단지를 추가하고를 만든

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> 
<session-factory> 
    <property name="hibernate.jndi.url">t3://127.0.0.1:7001</property> 
    <property name="hibernate.connection.datasource">test-ds</property> 
    <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.current_session_context_class">jta</property> 

    <mapping class="test.model.BaseEntity" /> 
    <mapping class="test.model.InvoiceDetail" /> 
    <mapping class="test.model.InvoiceMovement" /> 
    <mapping class="test.model.InvoicePaymentItem" /> 
    <mapping class="test.model.Job" /> 
    <mapping class="test.model.Member" /> 
</session-factory> 

있는 hibernate.cfg.xml weblogic 관리 콘솔을 통해 test-ds라는 이름의 데이터 소스와 jndi 이름이 test-ds라는 이름으로 저장됩니다. 모든 모델 조작 메소드를 ModelOperations 클래스로 어셈블했습니다. 이 클래스에서

@Stateless 
@TransactionManagement(TransactionManagementType.CONTAINER) 
public class ModelOperations implements ModelOperationsLocal { 

    @PersistenceContext(unitName = "beyazfatura") 
    private EntityManager em; 
... 

나는 방법은 아래에 언급 한 :

@Override 
@SuppressWarnings("unchecked") 
public List<Member> getMembers(int first, int pageSize, String sortField, 
     String sortOrder, Map<String, String> filters, Date beginDate, 
     Date endDate) { 
    Session session = null; 
    List<Member> memberList = null; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     Criteria crit = session.createCriteria(Member.class); 

     Criterion betweenDate = null; 
     if (beginDate != null) { 
      if (endDate == null) { 
       endDate = new Date();// now 
      } 
      betweenDate = Restrictions.between("createTime", beginDate, 
        endDate); 
     } 

     if (betweenDate != null) { 
      crit.add(betweenDate); 
     } 

     // sorting 
     if (sortField != null && !sortField.isEmpty()) { 
      if (!sortOrder.equalsIgnoreCase("UNSORTED")) { 
       if (sortOrder.equalsIgnoreCase("ASCENDING")) { 
        crit = crit.addOrder(Order.asc(sortField)); 
       } else { 
        crit = crit.addOrder(Order.desc(sortField)); 
       } 
      } 
     } 

     // filtering 
     if (filters != null && !filters.isEmpty()) { 
      Iterator<Entry<String, String>> iterator = filters.entrySet().iterator(); 
      while (iterator.hasNext()) { 
       Entry<String, String> entry = iterator.next(); 
       Class<?> type = Member.class.getDeclaredField(
         entry.getKey()).getType(); 
       try { 
        if (type.isEnum() 
          || Number.class.isAssignableFrom(type)) { 
         crit = crit.add(Restrictions.eq(
           entry.getKey(), 
           type.getDeclaredMethod("valueOf", 
           String.class).invoke(null, 
           entry.getValue()))); 
        } else { 
         crit = crit.add(Restrictions.like(entry.getKey(), 
           entry.getValue(), MatchMode.START)); 
        } 
       } catch (Exception ex) { 
        // Aim: return the list anyway. 
        LOG.warn(ex, ex); 
       } 
      } 
     } 

     if (first != -1) { 
      crit = crit.setFirstResult(first); 
     } 

     if (pageSize != -1) { 
      crit = crit.setMaxResults(pageSize); 
     } 

     memberList = crit.list(); 
    } catch (Exception e) { 
     LOG.error(e, e); 
    } finally { 
     session.close(); 
    } 

    return memberList; 
} 

@Override 
public Long getMemberCount(Date beginDate, Date endDate) { 
    Session session = null; 
    Long returnValue = 0L; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     Criteria crit = session.createCriteria(Member.class); 

     Criterion betweenDate = null; 
     if (beginDate != null) { 
      if (endDate == null) { 
       endDate = new Date();// now 
      } 
      betweenDate = Restrictions.between("createTime", beginDate, 
        endDate); 
     } 

     if (betweenDate != null) { 
      crit.add(betweenDate); 
     } 

     crit.setProjection(Projections.rowCount()); 
     if(crit.list() != null){ 
      returnValue = (Long) crit.list().get(0); 
     } else { 
      returnValue = 0L; 
     } 
    } catch (Exception e) { 
     LOG.error(e, e); 
    } finally { 
     session.close(); 
    } 
    return returnValue; 
} 

이는 HibernateUtil과 클래스입니다 : 내가 getMember 전화

public class HibernateUtil { 

    private static final Logger LOG = Logger.getLogger(HibernateUtil.class); 
    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      return new Configuration().configure().buildSessionFactory(); 
     } catch (Throwable e) { 
      LOG.error(e, e); 
      throw new ExceptionInInitializerError(e); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

클래스의 헤더는 다음과 같다 및 getMemberCount 메소드를 (데이터 테이블의) 백업 빈에서 가져올 수 있습니다. 나는 backing-bean에서 modeloperations 클래스에 주석을 달았다. @EJB 주석을 사용하기 위해 weblogic에 jsf2.war을 라이브러리로 배포합니다. 관리 빈과 LazyDataModel의 헤더는 다음과 같습니다 :

백업 콩 헤더 :

@ManagedBean(name = "memberManagement") 
@SessionScoped 
public class MemberManagement { 

    @EJB 
    private ModelOperationsLocal modelOperations; 
    private static final Logger LOG = Logger.getLogger(MemberManagement.class); 
    private MemberLazyDataModel memberModel; 

    @PostConstruct 
    public void initModel() { 
     memberModel = new MemberLazyDataModel(pageSize, beginDate, endDate, 
      modelOperations); 
    } 

LazyDataModel

public class MemberLazyDataModel extends LazyDataModel<Member> { 

    private ModelOperationsLocal modelOperations; 
    private static final Logger LOG = Logger.getLogger(MemberLazyDataModel.class); 
    private int pageSize; 
    private Date beginDate; 
    private Date endDate; 

    public MemberLazyDataModel() { 
    } 

    public MemberLazyDataModel(int pageSize, Date beginDate, Date endDate, 
     ModelOperationsLocal modelOperations) { 
     this.pageSize = pageSize; 
     this.beginDate = beginDate; 
     this.endDate = endDate; 
     this.modelOperations = modelOperations; 
     super.setPageSize(pageSize); 
     super.setRowCount(modelOperations.getMemberCount(beginDate, endDate).intValue()); 
    } 

    @Override 
    public List<Member> load(int first, int pageSize, String sortField, 
     SortOrder sortOrder, Map<String, String> filters) { 
     super.setRowCount(modelOperations.getMemberCount(beginDate, endDate).intValue()); 
     return modelOperations.getMembers(first, pageSize, sortField, 
      sortOrder.name(), filters, beginDate, endDate); 
    } 

    @Override 
    public String getRowKey(Member member) { 
     return member.getId() + ""; 
    } 

    @Override 
    public Member getRowData(String rowKey) { 

     List<Member> members = (List<Member>) getWrappedData(); 

     for (Member member : members) { 
      if ((member.getId() + "").equals(rowKey)) { 
       return member; 
      } 
     } 

     return null; 
    } 
} 

나는 다음 내가 할 멤버 데이터 테이블을 포함하는 페이지를 클릭하면 예외 (처음으로 hibernate.cfg.xml을 얻은 것처럼) :

INFO Configuration     - configuring from resource: /hibernate.cfg.xml 
INFO Configuration     - Configuration resource: /hibernate.cfg.xml 
INFO Configuration     - Configured SessionFactory: null 

일부 테이블 바인딩 로그 다음 로그 및 예외 :

INFO TransactionFactoryFactory  - Using default transaction strategy (direct JDBC transactions) 
INFO ransactionManagerLookupFactory - instantiating TransactionManagerLookup: org.hibernate.transaction.WeblogicTransactionManagerLookup 
INFO ransactionManagerLookupFactory - instantiated TransactionManagerLookup 
INFO SettingsFactory     - Automatic flush during beforeCompletion(): disabled 
INFO SettingsFactory     - Automatic session close at end of transaction: disabled 
INFO SettingsFactory     - JDBC batch size: 15 
INFO SettingsFactory     - JDBC batch updates for versioned data: disabled 
INFO SettingsFactory     - Scrollable result sets: enabled 
INFO SettingsFactory     - JDBC3 getGeneratedKeys(): enabled 
INFO SettingsFactory     - Connection release mode: auto 
INFO SettingsFactory     - Default batch fetch size: 1 
INFO SettingsFactory     - Generate SQL with comments: disabled 
INFO SettingsFactory     - Order SQL updates by primary key: disabled 
INFO SettingsFactory     - Order SQL inserts for batching: disabled 
INFO SettingsFactory     - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 
INFO ASTQueryTranslatorFactory  - Using ASTQueryTranslatorFactory 
INFO SettingsFactory     - Query language substitutions: {} 
INFO SettingsFactory     - JPA-QL strict compliance: disabled 
INFO SettingsFactory     - Second-level cache: enabled 
INFO SettingsFactory     - Query cache: disabled 
INFO SettingsFactory     - Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory 
INFO SettingsFactory     - Optimize cache for minimal puts: disabled 
INFO SettingsFactory     - Structured second-level cache entries: disabled 
INFO SettingsFactory     - Statistics: disabled 
INFO SettingsFactory     - Deleted entity synthetic identifier rollback: disabled 
INFO SettingsFactory     - Default entity-mode: pojo 
INFO SettingsFactory     - Named query checking : enabled 
INFO SettingsFactory     - Check Nullability in Core (should be disabled when Bean Validation is on): disabled 
INFO SessionFactoryImpl    - building session factory 
INFO BasicTypeRegistry    - Type registration [materialized_blob] overrides previous : [email protected] 
INFO SessionFactoryObjectFactory  - Not binding factory to JNDI, no JNDI name configured 
INFO SchemaUpdate     - Running hbm2ddl schema update 
INFO SchemaUpdate     - fetching database metadata 
ERROR SchemaUpdate     - could not get database metadata 
java.sql.SQLException: Cannot set auto commit to "true" when in distributed transaction. 
     at weblogic.jdbc.wrapper.JTSConnection.setAutoCommit(JTSConnection.java:625) 
     at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:60) 
     at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:168) 
     at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:375) 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) 

이 예외에 대한 귀하의 생각은 어떻습니까? 감사합니다. .

답변

0

나는 단서가 최대 절전 모드 docs에서

INFO SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured 

에 생각 :

3.8.2. JNDI- 바운드 SessionFactory

JNDI- 바운드 Hibernate SessionFactory는 공장의 검색 기능 을 단순화하고 새로운 세션을 생성 할 수 있습니다. 그러나 이것은 JNDI 바운드 데이터 소스에 대한 과 관련이 없습니다. 둘 다 단순히 동일한 레지스트리를 사용합니다.

SessionFactory를 JNDI 네임 스페이스에 바인딩하려면 최대 절전 모드 속성을 사용하여 이름 (예 : java : hibernate/SessionFactory)을 지정하십시오.session_factory_name. 이 속성을 생략하면 SessionFactory가 JNDI에 바인딩되지 않습니다. 이는 읽기 전용 JNDI 기본 구현 (예 : )의 환경에서 특히 유용합니다.

따라서 최대 절전 모드 구성에 hibernate.session_factory_name을 제공해야합니다.

+0

를 추가하면 javax.naming.OperationNotSupportedException이 발생합니다 : ReadOnlyContext에서 createSubcontext가 허용되지 않습니다. 나머지 이름 '/ hibernate' –

+0

Weblogic에 대해 많이 알지 못하지만 응용 프로그램에서 java : space에 최대 절전 모드 항목을 만들 수 없기 때문에 Weblogic 구성 문제와 같은 것 같습니다. 나는 다른 이름을 시도 할 것이다. – beny23

+0

'hibernate.session_factory_name'에서 http://stackoverflow.com/questions/1665086/how-to-access-sessionfactory-of-hibernate-using-jndi-in-weblogic-9-2-server/에서 주어진대로 시도하십시오. 1665191 # 1665191 – JoseK