+1 امتیاز
قبل در برنامه نویسی توسط (50 امتیاز)
برچسب گذاری دوباره قبل توسط

در یک پروژه نرم افزاری از Spring + Hibernate بهمراه بانک اطلاعاتی mysql استفاده شده است. پس از دریافت اطلاعات از کاربر براساس Entity های موجود یک Entity ایجاد و با استفاده از متد persist مربوط به EntityManager به منظور ثبت در بانک اطلاعاتی استفاده می شود. علیرغم تنظیمات صورت پذیرفته در فایل های پیکربندی متاسفانه متد مورد نظر بدون خطا انجام شده ولی تغییرات در بانک اطلاعاتی ثبت نمی گردد.

 application context
 
 @Repository
public class AccountManager implements IAccountManager {

	@PersistenceContext
	private EntityManager em; /* -- 8< -- Query methods omitted -- 8< -- */

	public Account storeAccount(Account ac) {
		em.persist(ac);
		return ac;
	}
}

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

به نظر میرسه که شما هیچ Transaction باز نکردین و به همین دلیل اطلاعات شما در دیتابیس ذخیره نمی شود.

برای حل مشکل باید با کدی شبیه کد زیر درون یک transaction عملیات خود را انجام دهید:

EntityTransaction tx = em.getTransaction();
try
{
    tx.begin();
    
    //your code to persist objects
    
    tx.commit();
}
finally
{
    if (tx.isActive())
    {
        tx.rollback();
    }
}

اگر هم از Spring استفاده می کنید در صورتی که Transaction Management در Spring را فعال کرده اید (JpaTransactionManager) کافی است بر روی کلاس AccountManager خود @Transactional بزنید.

قبل توسط (50 امتیاز)
در صورت استفاده از کد بالا، با توجه به اینکه "transaction-type="RESOURCE_LOCAL بوده از یک طرف و تنظیمات
<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
                <!--
                    Specific properties for Hibernate are in persistence.xml file,
                    but also can be placed here and removed from persistence.xml file.  
                -->
            </bean>
        </property>
        <property name="dataSource" ref="pooledDataSource" />
        <property name="persistenceUnitName" value="persistenceUnit"/>
    </bean>
از طرف دیگر، با خطای
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
مواجه می شویم. لازم بذکر است با استفاده از @PersistenceContext
    private EntityManager entityManager;
entity manager را inject کرده ایم
قبل توسط (50 امتیاز)
در صورتی که از transaction manager spring نیز به صورت گفته شده یا حتی بالای متد استفاده نماییم، نیز مشکل به قوت خودش باقی ست.
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />       
    </bean>
        
        <!-- Use @Transaction annotations for managing transactions -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
قبل توسط (1.1هزار امتیاز)
احتمال زیاد پروژه شما مشکل تنظیمات داره، مثال زیر هم transaction spring داره و هم jpa  روی RESOURCE_LOCAL تنظیم شده. یه نگاهی بیاندازید و مشکل رو پیدا کنید:
http://www.objectdb.com/tutorial/jpa/spring/maven

سوالات مشابه

+1 امتیاز
1 پاسخ 1.1هزار بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط masoud shahhosseini_ (45 امتیاز)
+1 امتیاز
1 پاسخ 570 بازدید
0 امتیاز
3 پاسخ 866 بازدید
سوال شده 5 سال قبل در برنامه نویسی توسط یوری (426 امتیاز)
0 امتیاز
2 پاسخ 1.8هزار بازدید
+1 امتیاز
3 پاسخ 1.6هزار بازدید
0 امتیاز
1 پاسخ 607 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط kashi (7.2هزار امتیاز)
0 امتیاز
1 پاسخ 458 بازدید
+5 امتیاز
1 پاسخ 4.4هزار بازدید
+1 امتیاز
1 پاسخ 603 بازدید
...