Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bitronix+;弹簧&x2B;冬眠+;坚持不懈_Java_Hibernate_Spring_Persistence - Fatal编程技术网

Java Bitronix+;弹簧&x2B;冬眠+;坚持不懈

Java Bitronix+;弹簧&x2B;冬眠+;坚持不懈,java,hibernate,spring,persistence,Java,Hibernate,Spring,Persistence,我正在尝试创建事务管理器,并将其与Hibernate for Oracle一起使用 我的persistence.xml文件是: <persistence-unit name="org.drools.persistence.jpa" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-

我正在尝试创建事务管理器,并将其与Hibernate for Oracle一起使用

我的persistence.xml文件是:

<persistence-unit name="org.drools.persistence.jpa"
        transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/testDS1</jta-data-source>
        <class>org.drools.persistence.session.SessionInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <class>org.drools.persistence.processinstance.WorkItemInfo</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.connection.autocommit" value="false" />
            <property name="hibernate.max_fetch_depth" value="3" />
            <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/> 
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.BTMTransactionManagerLookup" />
        </properties>
    </persistence-unit>
我得到一个例外:

Caused by: org.hibernate.HibernateException: Could not find datasource: jdbc/testDS1
异常出现在
ds=(数据源)NamingHelper.getInitialContext(props.lookup(jndiName)上

  • 有什么问题吗

  • Hibernate持久性如何知道引用spring
    txManager
    bean


  • 你是将其部署为战争还是EAR?您是否在web.xml中声明了数据源并在app server上进行了设置

    更新:由于您在WAR中声明了数据源,请确保您在Tomcat中拥有JNDI数据源

    您的错误是:“由以下原因引起:org.hibernate.HibernateException:找不到数据源:jdbc/testDS1”。这是一个JNDI查找名称

    那么,“我不想”这个词在哪里呢

    Spring需要一个Java命名和目录服务来查找与此名称关联的数据源;这就是Tomcat提供的。如果不是Tomcat,你建议春天从哪里来?命名服务是JavaEE应用服务器的一部分

    您要么在Tomcat上设置JNDI数据源和连接池,要么放弃它提供的好处,告诉Spring改用DriverManager数据源:


    调用Persistence.createEntityManagerFactory()时,您的数据源似乎尚未创建。由于BitronixtTransactionManager bean依赖于数据源bean,因此您应该看到一些信息日志,告诉您BTM已经启动,这意味着数据源也已经创建

    另一个潜在原因可能是Hibernate没有在正确的JNDI上下文中查找数据源。您可以启用bitronix.tm.jndi调试日志,以断言正在调用其jndi提供程序

    有什么问题吗

    通过询问
    jdbc/testDS1
    ,您是否能够在独立的java应用程序中使用此数据源?在常规Tomcat数据源中,您需要请求
    java:comp/env/jdbc/testDS1
    ,而不仅仅是
    jdbc/testDS1

    Hibernate持久性如何知道如何引用SpringTXManager bean

    没有。您这样说是为了休眠:

            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.BTMTransactionManagerLookup" />
    
    
    

    因此,Hibernate将使用lookup类来“查找”事务管理器:-)

    我相信我已经运行了类似的场景。My persistence.xml如下所示:

    <persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <!-- other configuration ommited -->
        <jta-data-source>java:comp/env/jdbc/YourPersistentUnitJNDI_Name</jta-data-source>
        <!-- other configuration ommited -->
    </persistence-unit>
    
    
    java:comp/env/jdbc/YourPersistentUnitJNDI_名称
    
    spring应用程序bean xml文件如下所示:

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="myPersistenceUnit" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
            </property>
        </bean>
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
            </bean>
    
    
    

    希望有帮助

    持久性提供程序在jndi上进行查找。Spring应用程序上下文中定义的数据源未绑定到jndi。因此,持久性提供程序对数据源的查找尝试失败,因为没有绑定到jndi的此类数据源

    您可能需要检查一下


    您能否尝试在服务器上下文中定义数据源,并通过jndi名称在spring应用程序中查找它们?

    我认为要么persistence.xml配置不正确,要么您没有启动spring容器。 这里我发布了我的persistence.xml代码

    enter code here
    <persistence-unit name="org.drools.task" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/mysql</jta-data-source>
        <class>org.drools.task.Attachment</class>
    <properties>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.current_session_context_class" value="jta" />
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
            <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.show_sql" value="true" />
    
            <!-- after first run the application, should comment it, else it will drop and create table each time 
            <property name="hibernate.hbm2ddl.auto" value="create" /> -->
    </properties>
    </persistence-unit>
    
    事务管理器配置与您发布的相同。
    它可以工作。

    如果我使用Spring,为什么我需要用tomcat设置JNDI数据?事实上,这对我很有用。不起作用的是:DataSource ds=(DataSource)ic.lookup(“java:comp/UserTransaction”);当我用tomcat配置它时,它曾经工作过。另外,在您的回答中,我没有使用spring directlyso,您实际上是在说我必须一起配置tomcat和spring,以便获得“java:comp/UserTransaction”jndi?我担心spring文档会对典型的JTA事务(必需、支持、强制、从不)说一些其他的话,一个简单的JtaTransactionManager定义就是您所需要的,可以在所有J2EE服务器上完全移植。这与JTA UserTransaction的功能相对应,J2EE为其指定了一个标准JNDI名称(“java:comp/UserTransaction”)。对于这种79*类型的JTA使用,无需配置特定于服务器的TransactionManager查找。阅读更多:我看到它是在日志消息中创建的:2011-03-15 23:01:36672 DEBUG(poolgdatasource.java:84)-为jdbc/testDS1构建XA池,连接为0,但我仍然得到了异常!再次说明:另一个潜在原因可能是Hibernate没有在正确的JNDI上下文中查找数据源。您可以启用bitronix.tm.jndi调试日志来断言其jndi提供程序正在被调用。您好!我刚刚意识到我的问题是需要在上下文中找到java:comp/UserTransaction。问题不在于ds1。当我用tomcat创建它时,它自动将选项卡绑定到java:comp/UserTransaction。我怎样才能用春天来做呢?
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="myPersistenceUnit" />
            <property name="jpaVendorAdapter">
                <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
            </property>
        </bean>
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
            </bean>
    
    enter code here
    <persistence-unit name="org.drools.task" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/mysql</jta-data-source>
        <class>org.drools.task.Attachment</class>
    <properties>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.current_session_context_class" value="jta" />
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
            <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.show_sql" value="true" />
    
            <!-- after first run the application, should comment it, else it will drop and create table each time 
            <property name="hibernate.hbm2ddl.auto" value="create" /> -->
    </properties>
    </persistence-unit>
    
    enter code here
        ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
        JtaTransactionManager txManager = (JtaTransactionManager) ctx.getBean("txManager");
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = txManager.getTransaction(def);
        System.out.println("The transaction manager is "+txManager);
        System.out.println("The transaction is "+status);