4

Мы используем atomikos JTA с пружиной и двумя различными источниками данных mysql.Данные о пружинах - два разных источника данных в одной и той же транзакции, вызывающей аномалию

Мы получили проблему,

Когда мы используем два разных репозиториев (из 2-х различных источников данных) на том же @Transactional метода мы получаем ошибку:

Caused by: java.sql.SQLException: Unable to enlist connection the transaction 

Это происходит, когда второе хранилище делая некоторые действия против источника данных.

Мы считаем, что это связано с менеджером транзакций (atomikos jta), который может иметь проблемы, когда в одну транзакцию вовлечены 2 разных источника данных.

вот источники данных XML:

<bean 
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

<bean id="xaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" 
    lazy-init="true"> 
    <property name="pinGlobalTxToPhysicalConnection" value="true" /> 
    <property name="url" value="${mysql_url}" /> 
    <property name="user" value="root" /> 
    <property name="password" value="xxx" /> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource"> 
    <property name="initialSize" value="10" /> 
    <property name="maxActive" value="100" /> 
    <property name="maxIdle" value="15" /> 
    <property name="minIdle" value="10" /> 
    <property name="timeBetweenEvictionRunsMillis" value="10000" /> 
    <property name="minEvictableIdleTimeMillis" value="60000" /> 
    <property name="validationQuery" value="/* ping */ SELECT 1" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="xaDataSourceInstance" ref="xaDataSource" /> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="removeAbandoned" value="true" /> 
    <property name="removeAbandonedTimeout" value="300" /> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="packagesToScan" value="com.xxx.model" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="MYSQL" /> 
      <property name="showSql" value="false" /> 
      <property name="generateDdl" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="javax.persistence.transactionType" value="JTA" /> 
      <entry key="hibernate.transaction.manager_lookup_class" 
       value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" /> 
      <entry key="hibernate.connection.autocommit" value="false" /> 
     </map> 
    </property> 
</bean> 

<!-- shared data source --> 

<bean id="shardXaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" 
    lazy-init="true"> 
    <property name="pinGlobalTxToPhysicalConnection" value="true" /> 
    <property name="url" value="${shared_mysql_url}" /> 
    <property name="user" value="root" /> 
    <property name="password" value="xxx" /> 
</bean> 

<bean id="shareddDataSource" class="org.apache.commons.dbcp.managed.BasicManagedDataSource"> 
    <property name="initialSize" value="10" /> 
    <property name="maxActive" value="100" /> 
    <property name="maxIdle" value="15" /> 
    <property name="minIdle" value="10" /> 
    <property name="timeBetweenEvictionRunsMillis" value="10000" /> 
    <property name="minEvictableIdleTimeMillis" value="60000" /> 
    <property name="validationQuery" value="/* ping */ SELECT 1" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="xaDataSourceInstance" ref="shardXaDataSource" /> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="removeAbandoned" value="true" /> 
    <property name="removeAbandonedTimeout" value="300" /> 
</bean> 

<bean id="sharedEntityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="packagesToScan" value="com.xxx.shared.model" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="shareddDataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="database" value="MYSQL" /> 
      <property name="showSql" value="false" /> 
      <property name="generateDdl" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="javax.persistence.transactionType" value="JTA" /> 
      <entry key="hibernate.transaction.manager_lookup_class" 
       value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" /> 
      <entry key="hibernate.connection.autocommit" value="false" /> 
     </map> 
    </property> 
</bean> 

и transaction.xml:

<tx:annotation-driven proxy-target-class="true" /> 

<tx:jta-transaction-manager 
    transaction-manager="atomikosTransactionManager" /> 

<tx:annotation-driven transaction-manager="atomikosTransactionManager" 
    proxy-target-class="true" /> 

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
    init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
    <property name="allowCustomIsolationLevels" value="true" /> 
</bean> 

* EDIT (19.01.2014) *

Так, по М. Deinum нам удалось убрать ошибку, но теперь не происходит транзакции актуария (при исключении, например, нет отката)

Вот наша новая конфигурация:

данных source.xml:

<bean id="xaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" 
    lazy-init="true"> 
    <property name="pinGlobalTxToPhysicalConnection" value="true" /> 
    <property name="url" value="${mysql_url}" /> 
    <property name="user" value="root" /> 
    <property name="password" value="6918001" /> 
</bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jtaDataSource" ref="xaDataSource" /> 
    <property name="packagesToScan" value="com.xxx.model" /> 
    <property name="jpaProperties"> 
     <props> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop  key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup  </prop> 
    </props> 
    </property> 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="showSql" value="false" /> 
     <property name="generateDdl" value="false" /> 
    </bean> 
</property> 
</bean> 

<bean id="shardXaDataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" 
    lazy-init="true"> 
    <property name="pinGlobalTxToPhysicalConnection" value="true" /> 
    <property name="url" value="${shared_mysql_url}" /> 
    <property name="user" value="root" /> 
    <property name="password" value="6918001" /> 
</bean> 


<bean id="sharedEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="jtaDataSource" ref="shardXaDataSource" /> 
<property name="packagesToScan" value="com.xxx.shared.model" /> 
<property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
    </props> 
</property> 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="showSql" value="false" /> 
     <property name="generateDdl" value="false" /> 
    </bean> 
</property> 

transaction.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

<tx:annotation-driven proxy-target-class="true" /> 


<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
init-method="init" destroy-method="close"> 
<property name="forceShutdown" value="false" /> 
</bean> 

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
<property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
<property name="transactionManager" ref="atomikosTransactionManager" /> 
<property name="userTransaction" ref="atomikosUserTransaction" /> 
<property name="allowCustomIsolationLevels" value="true" /> 
</bean> 

</beans> 

* EDIT 01/20/2014 *

Нам удалось заставить его работать, но тонны предупреждений при запуске:

20 Jan 2014 15:14:16 WARN AbstractDataSourceBean - AtomikosDataSoureBean 'xaDataSource': poolSize equals default - this may cause performance problems! 
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:17 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:17 WARN JtaPlatformInitiator - HHH000427: Using deprecated org.hibernate.transaction.TransactionManagerLookup strategy [hibernate.transaction.manager_lookup_class],  use newer org.hibernate.service.jta.platform.spi.JtaPlatform strategy instead [hibernate.transaction.jta.platform] 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AbstractDataSourceBean - AtomikosDataSoureBean 'sharedXaDataSource': poolSize equals default - this may cause performance problems! 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN JtaPlatformInitiator - HHH000427: Using deprecated org.hibernate.transaction.TransactionManagerLookup strategy [hibernate.transaction.manager_lookup_class], use newer org.hibernate.service.jta.platform.spi.JtaPlatform strategy instead [hibernate.transaction.jta.platform] 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN AtomikosConnectionProxy - atomikos connection proxy for [email protected]: WARNING: transaction manager not running? 
20 Jan 2014 15:14:18 WARN EntityManagerFactoryRegistry - HHH000436: Entity manager factory name (default) is already registered. If entity manager will be clustered or passivated, specify a unique value for property 'hibernate.ejb.entitymanager_factory_name' 
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - No properties path set - looking for transactions.properties in classpath... 
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - transactions.properties not found - looking for jta.properties in classpath... 
20 Jan 2014 15:14:18 WARN UserTransactionServiceImp - Failed to open transactions properties file - using default values 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator  10.0.50.117.tm0050100104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050100104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050200104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050200104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050300104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050300104 with state COMMITTING 
20 Jan 2014 15:14:18 WARN CoordinatorImp - Local heuristic termination of coordinator 10.0.50.117.tm0050400104 with state COMMITTING 

Новая конфигурация:

<bean id="xaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
    init-method="init" destroy-method="close"> 
    <property name="xaDataSourceClassName"> 
     <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> 
    </property> 
    <property name="uniqueResourceName"><value>xaDataSource</value></property>  
    <property name="xaProperties"> 
     <props> 
      <prop key="url">${mysql_url}</prop> 
      <prop key="user">root</prop> 
      <prop key="password">xxx</prop> 
     </props> 
    </property> 
</bean> 

<bean id="sharedXaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" 
    init-method="init" destroy-method="close"> 
    <property name="xaDataSourceClassName"> 
     <value>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</value> 
    </property> 
    <property name="uniqueResourceName"><value>sharedXaDataSource</value></property> 
    <property name="xaProperties"> 
     <props> 
      <prop key="url">${shared_mysql_url}</prop> 
      <prop key="user">root</prop> 
      <prop key="password">xxx</prop> 
     </props> 
    </property> 
</bean> 

ответ

6
<tx:annotation-driven proxy-target-class="true" /> 

<tx:jta-transaction-manager 
    transaction-manager="atomikosTransactionManager" /> 

<tx:annotation-driven transaction-manager="atomikosTransactionManager" 
    proxy-target-class="true" /> 

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
    init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
    <property name="allowCustomIsolationLevels" value="true" /> 
</bean> 

Ваша конфигурация несовершенна и содержит дублирование, которое, вероятно, путает весной. Как JtaTransactionManager, так и <tx:jta-transaction-manager /> создают JtaTransactionManager.

Следующее ваше <tx:annotation-driven > должно указывать на JtaTransactionManager, но не указывать на UserTransactionManager.

Так первый исправить вашу конфигурацию:

<tx:annotation-driven proxy-target-class="true" /> 

<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" 
    init-method="init" destroy-method="close"> 
    <property name="forceShutdown" value="false" /> 
</bean> 

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> 
    <property name="transactionTimeout" value="300" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="atomikosTransactionManager" /> 
    <property name="userTransaction" ref="atomikosUserTransaction" /> 
    <property name="allowCustomIsolationLevels" value="true" /> 
</bean> 

Предполагая, что вы используете последнюю версию Spring 3.2 вместо инъекции dataSource свойства впрыскивать jtaDataSource на вашем LocalContainerEntityManagerFactoryBean, рядом ваш jpaProperties и jpaPropertiesMap могут быть очищены.

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jtaDataSource" ref="xaDataSource" /> 
    <property name="packagesToScan" value="com.xxx.model" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop> 
     </props> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" /> 
      <property name="showSql" value="false" /> 
      <property name="generateDdl" value="false" /> 
     </bean> 
    </property> 
</bean> 

hibernate.connection В свойстве бесполезно, как вы нагнетание Spring управляемого источника данных. Из-за инъекции jtaDataSource можно удалить jpaProperty для javax.persistence.transactionType. HibernateJpaVendorAdapter уже устанавливает HibernateJpaDialect, и вы можете использовать свойство databasePlatform, чтобы указать диалект.

Что касается ваших источников данных, вы должны использовать обертки Atomikos для источников данных, чтобы они знали Atomicos. Для этого используйте AtomikosDataSourceBean вместо xa предоставленного источника данных для вашего драйвера JDBC.

<bean id="xaDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close"> 
    <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" /> 
    <property name="uniqueResourceName" value="xaDataSource"/>  
    <property name="xaProperties"> 
     <props> 
      <prop key="url">${mysql_url}</prop> 
      <prop key="user">root</prop> 
      <prop key="password">xxx</prop> 
     </props> 
    </property> 
</bean> 

Наконец вы используете BasicDataSource в качестве ссылки в спящий режим, тогда вы должны использовать включен Xa (и завернуты) DataSource.

+0

M.Deinum, Ошибка теперь не бросается, и это отличная новость !. однако теперь откат не выдается для всех моих entites (из любого источника данных). например, если моя служба аннотируется с @Transactional и я сохраняю сущность внутри нее, если ошибка возникает после того, как нет отката :(, Iv'e отредактировал мой оригинальный пост с изменениями, которые я сделал. Спасибо! – Urbanleg

+0

Есть ли нет отката в регистрации или отсутствии отката в базе данных? Вы используете MySQL, поэтому также убедитесь, что используете типы транзакционных таблиц (InnoDB, а не MyISAM). Возможно, вы захотите включить ведение журнала DEBUG для 'org.springframework' и посмотреть, что произойдет (если tx правильно запущен и т. д.) –

+0

Спасибо Deinum, мы сделали то, что вы предложили, у нас есть ошибка в наших журналах. Мы помещаем его в исходное сообщение (*** edit2 ***) – Urbanleg

0

Попробуйте это: На ваших менеджеров транзакций добавить:

<qualifier value="transactionManager1"/> 

пример:

<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory1" /> 
    <qualifier value="transactionManager1"/> 
</bean> 

тогда в вас реализации DAO сделать что-то вроде этого:

@Repository("Users1DAO") 
public class Users1DAOJpaImp implements Users1DAO { 

    @PersistenceContext(unitName="datasources1") 
    @Qualifier("transactionTemplate1") 
    private EntityManager em; 

    @Override 
    @Transactional(value="transactionManager1", readOnly = false, propagation = Propagation.MANDATORY) 
    public void save(Users1 user) { 
     em.persist(user); 
    } 

} 
Смежные вопросы