Hibernate weblogic(10.3.4)控制台中出现奇怪的休眠错误

Hibernate weblogic(10.3.4)控制台中出现奇怪的休眠错误,hibernate,jsf-2,ejb-3.0,primefaces,weblogic-10.x,Hibernate,Jsf 2,Ejb 3.0,Primefaces,Weblogic 10.x,我有以下配置文件,在获取Hibernate会话时出现以下异常。hibernate.cfg.xml中是否存在问题或缺少属性 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.c

我有以下配置文件,在获取Hibernate会话时出现以下异常。hibernate.cfg.xml中是否存在问题或缺少属性

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>
在本课程中,我有一种方法,如下所述:

@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;
}
我从datatable的支持Bean调用getMember和getMemberCount方法。我在支持bean中注释了modeloperations类。为了使用@EJB注释,我将jsf2.war部署为weblogic中的库。托管bean和LazyDataModel的标头如下所示:

支持bean头:

@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);
    }
懒散数据模型

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;
    }
}  
一些表绑定日志然后是以下日志和异常:

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 : org.hibernate.type.MaterializedBlobType@1a11d34
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)  
你对这个例外有什么看法? 谢谢。

我想线索已经找到了

INFO  SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
从休眠状态:

3.8.2。绑定JNDI的会话工厂

绑定JNDI的Hibernate SessionFactory可以简化查找功能 创建新的会话。然而,这并不相关 到JNDI绑定的数据源;两者只是使用相同的注册表

如果希望将SessionFactory绑定到JNDI命名空间, 使用属性指定名称,例如java:hibernate/SessionFactory hibernate.session\u工厂名称。如果省略此属性,则 SessionFactory将不会绑定到JNDI。这在某些情况下特别有用 在Tomcat中具有只读JNDI默认实现的环境, 比如说


因此,您需要在hibernate配置中提供一个hibernate.session\u factory\u名称。

当我添加时,它会显示javax.naming.OperationNotSupportedException:createSubcontext不允许在ReadOnlyContext中使用;剩余名称“/hibernate”我对Weblogic了解不多,但这听起来像是Weblogic配置问题,因为您的应用程序不允许在java:space中创建hibernate条目。我会尝试使用其他名称。在hibernate.session\u factory\u name上,请按照
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;
    }
}  
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 : org.hibernate.type.MaterializedBlobType@1a11d34
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)  
INFO  SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured