Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 Spring/Hibernate项目@Transactional注释值未使用并自动替换_Java_Spring_Hibernate_Spring Mvc_Transactions - Fatal编程技术网

Java Spring/Hibernate项目@Transactional注释值未使用并自动替换

Java Spring/Hibernate项目@Transactional注释值未使用并自动替换,java,spring,hibernate,spring-mvc,transactions,Java,Spring,Hibernate,Spring Mvc,Transactions,我对项目中的Spring4/Hibernate4和xml数据库配置有问题。 数据库分为2个部分。在@Transactional处指定了错误的transactionManager,但hibernate连接到正确的数据库时未引发任何异常。 Dao方法由@Transactional注释,如下所示: @Repository public class SampleDao { @Transactional("database2TransactionManager") public Samp

我对项目中的Spring4/Hibernate4和xml数据库配置有问题。 数据库分为2个部分。在
@Transactional
处指定了错误的transactionManager,但hibernate连接到正确的数据库时未引发任何异常。 Dao方法由
@Transactional
注释,如下所示:

@Repository
public class SampleDao {

    @Transactional("database2TransactionManager")
    public SamplePojo getSamplePojo(String smth) {
    database1SessionFactory.getCurrentSession().createCriteria(SamplePojo.class)
        //some code
    }
}
假设
SampleDao.getSamplePojo()
实际上从database1TransactionManager定义的database1获取数据。在这种情况下,
@Transactional
值被忽略,而使用database1TransactionManager

即使查询引发异常,也可以将查询限制为使用指定的transactionManager而不是任何其他事务。即使
@Transactional
将带有打字错误的名称指定为transactionManager

database.xml:

<tx:annotation-driven transaction-manager="database1TransactionManager"/>
<tx:annotation-driven transaction-manager="database2TransactionManager"/>

<!--  Database related configuration  -->
<bean id="database1DataSource" destroy-method="close">
//properties
</bean>

<!--  Database related configuration  -->
<bean id="database2DataSource" destroy-method="close">
//properties
</bean>

<bean id="database1SessionFactory" name="database1SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database1DataSource">
//properties
</bean>

<bean id="database2SessionFactory" name="database2SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database2DataSource">
//properties
</bean>

<bean id="database1TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database1SessionFactory">
    <property name="sessionFactory" ref="database1SessionFactory"/>
    <qualifier value="database1TransactionManager"/>
</bean>

<bean id="database2TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database2SessionFactory">
    <property name="sessionFactory" ref="database2SessionFactory"/>
    <qualifier value="database2TransactionManager"/>
</bean>

//性质
//性质
//性质
//性质

我使用单独的数据库,所以显示这样的错误是很重要的,我知道它们,而不是Spring4自动进行一些替换。
我做了一些调试,这就是我发现的。有一个标记为@Transactional的DAO方法,为其指定了database2TransactionManager。但是,database2TransactionManager无论如何不能用于此方法,因为它是通过database1SessionFactory访问的。这是两个独立的数据库,具有独立的用户等。因此,实际上,Spring不使用database2TransactionManager,而是用database1SessionFactory中的值替换它。结果发现@Transactional配置错误,spring interactions仍然可以使用它。

感谢大家。我决定不需要任何Spring事务同步。 我将其添加到database.xml中:

<tx:annotation-driven transaction-manager="database1TransactionManager"/>
<tx:annotation-driven transaction-manager="database2TransactionManager"/>

<!--  Database related configuration  -->
<bean id="database1DataSource" destroy-method="close">
//properties
</bean>

<!--  Database related configuration  -->
<bean id="database2DataSource" destroy-method="close">
//properties
</bean>

<bean id="database1SessionFactory" name="database1SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database1DataSource">
//properties
</bean>

<bean id="database2SessionFactory" name="database2SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database2DataSource">
//properties
</bean>

<bean id="database1TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database1SessionFactory">
    <property name="sessionFactory" ref="database1SessionFactory"/>
    <qualifier value="database1TransactionManager"/>
</bean>

<bean id="database2TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database2SessionFactory">
    <property name="sessionFactory" ref="database2SessionFactory"/>
    <qualifier value="database2TransactionManager"/>
</bean>
property name=“transactionSynchronization”value=“2”


现在,如果@Transactional值不正确,将引发异常。

感谢大家。我决定不需要任何Spring事务同步。 我将其添加到database.xml中:

<tx:annotation-driven transaction-manager="database1TransactionManager"/>
<tx:annotation-driven transaction-manager="database2TransactionManager"/>

<!--  Database related configuration  -->
<bean id="database1DataSource" destroy-method="close">
//properties
</bean>

<!--  Database related configuration  -->
<bean id="database2DataSource" destroy-method="close">
//properties
</bean>

<bean id="database1SessionFactory" name="database1SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database1DataSource">
//properties
</bean>

<bean id="database2SessionFactory" name="database2SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database2DataSource">
//properties
</bean>

<bean id="database1TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database1SessionFactory">
    <property name="sessionFactory" ref="database1SessionFactory"/>
    <qualifier value="database1TransactionManager"/>
</bean>

<bean id="database2TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database2SessionFactory">
    <property name="sessionFactory" ref="database2SessionFactory"/>
    <qualifier value="database2TransactionManager"/>
</bean>
property name=“transactionSynchronization”value=“2”


现在,如果@Transactional值不正确,将引发异常。

对于初学者,请删除其中一个
元素,但无论如何只有一个元素有效。但是,您不可能拥有一个默认事务管理器,或者需要明确指定要使用哪个事务管理器。您真的需要2个会话工厂和2个事务管理器吗?还是您认为您只需要它们?@M.Deinum我们不能有多个事务管理器吗?他有不同的预选赛。请参阅:可以,但只能有1个
。这仅用于启用
@Transactional
,并告知默认情况下使用哪个tx-manager。在这种情况下,最后一个赢了,
database2TransactionManager
将是默认值(即对于
@Transactional
,没有指定特定的一个,将使用这个)。事务管理器的数量不会影响
元素的数量。拥有不止一个根本没有意义…我做了一些调试,这就是我发现的。有一个标记为@Transactional的DAO方法,为其指定了database2TransactionManager。但是,database2TransactionManager无论如何不能用于此方法,因为它是通过database1SessionFactoryPavel访问的,但是Spring如何知道要使用哪个事务管理器呢?它是否试图从会话工厂推断正在使用什么?在示例中,您可以清楚地看到,有两台单独的机器具有单独的数据库/方案,一个方法被标记为使用database1TransactionManager(它连接到database1数据源),但hibernate会话工厂用于Database2。我们这里有两个交易吗?一个用于database1,在调用方法时启动,另一个用于database2,在使用数据库2的会话工厂时启动?对于初学者,删除一个
元素,但只有一个元素有效。但是,您不可能拥有一个默认事务管理器,或者需要明确指定要使用哪个事务管理器。您真的需要2个会话工厂和2个事务管理器吗?还是您认为您只需要它们?@M.Deinum我们不能有多个事务管理器吗?他有不同的预选赛。请参阅:可以,但只能有1个
。这仅用于启用
@Transactional
,并告知默认情况下使用哪个tx-manager。在这种情况下,最后一个赢了,
database2TransactionManager
将是默认值(即对于
@Transactional
,没有指定特定的一个,将使用这个)。事务管理器的数量不会影响
元素的数量。拥有不止一个根本没有意义…我做了一些调试,这就是我发现的。有一个标记为@Transactional的DAO方法,为其指定了database2TransactionManager。但是,database2TransactionManager无论如何不能用于此方法,因为它是通过database1SessionFactoryPavel访问的,但是Spring如何知道要使用哪个事务管理器呢?它是否试图从会话工厂推断正在使用什么?在示例中,您可以清楚地看到,有两台单独的机器具有单独的数据库/方案,一个方法被标记为使用database1TransactionManager(它连接到database1数据源),但hibernate会话工厂用于Database2。我们这里有两个交易吗?一个用于database1,在调用方法时启动,另一个用于database2,在使用database2的会话工厂时启动?