عدم بروز رسانی بانک اطلاعاتی با وجود عدم نمایش خطا در EntityManager

+1 رأی
میانگین بازدید روزانه 0.07167 بازدید

در یک پروژه نرم افزاری از 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;
	}
}
سوال 6 سال قبل در تالار برنامه نویسی توسط amin_y64 (50 امتیاز)
برچسب گذاری مجدد در 6 سال قبل توسط Saeed Zarinfam

1 جواب

0 رأی

به نظر میرسه که شما هیچ 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 بزنید.

جواب 6 سال قبل توسط Saeed Zarinfam (899 امتیاز)
در صورت استفاده از کد بالا، با توجه به اینکه "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 کرده ایم
در صورتی که از 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"/>
احتمال زیاد پروژه شما مشکل تنظیمات داره، مثال زیر هم transaction spring داره و هم jpa  روی RESOURCE_LOCAL تنظیم شده. یه نگاهی بیاندازید و مشکل رو پیدا کنید:
http://www.objectdb.com/tutorial/jpa/spring/maven

سوال های مشابه

+1 رأی
1 جواب میانگین بازدید روزانه 0.54479 بازدید
سوال 2 سال قبل در تالار برنامه نویسی توسط masoud shahhosseini_ (40 امتیاز)
+1 رأی
1 جواب میانگین بازدید روزانه 0.21191 بازدید
0 رأی
3 جواب میانگین بازدید روزانه 0.35407 بازدید
سوال 3 سال قبل در تالار برنامه نویسی توسط یوری (426 امتیاز)
0 رأی
2 جواب میانگین بازدید روزانه 0.48796 بازدید
+1 رأی
3 جواب میانگین بازدید روزانه 0.29777 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.11313 بازدید
سوال 7 سال قبل در تالار برنامه نویسی توسط kashi (7,164 امتیاز)
0 رأی
1 جواب میانگین بازدید روزانه 0.09254 بازدید
+4 رأی
1 جواب میانگین بازدید روزانه 1.043,299 بازدید
0 رأی
1 جواب میانگین بازدید روزانه 0.13220 بازدید
+1 رأی
1 جواب میانگین بازدید روزانه 0.2348 بازدید
کانال تلگرام جواب یاب
...