Soru EntityManager persist () veritabanına hiçbir şey kaydetme


EntityManager'ım persist () diziden sırayı alır ve onu Image nesnesine koyar, ancak Image nesnesinin kendisi veritabanında görünmez. EntityManager.flush () bir hata verir, bu yüzden bu şekilde işlem yapamıyorum. İşte benim kodum.

@Repository
public class ImageDaoImpl extends BaseDao implements ImageDao {

@PersistenceContext
protected EntityManager entityManager;

@Override
@Transactional
public void create(Image image) {       
    JpaTemplate jpaTemplate = getJpaTemplate(entityManager);
    jpaTemplate.persist(image);
}

@Repository
public class BaseDao {

private JpaTemplate jpaTemplate;


public JpaTemplate getJpaTemplate(EntityManager entityManager){
    if(jpaTemplate == null)
        jpaTemplate = new JpaTemplate(entityManager);
    return jpaTemplate;
}

<bean id="entityManagerFactory"
       class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
       p:dataSource-ref="dataSource">
       <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
            </bean>
        </property>
        <property name="persistenceUnitName" value="sample"></property>
    </bean>



    <!-- DataSource Setup -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/imageCapture" />
        <property name="username" value="myusername" />
        <property name="password" value="mypassword" />
    </bean>


    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

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

25
2018-03-20 19:06


Menşei


hangi hangi JPA / bahar sürümünü kullanıyorsunuz? - Premraj
İlkbahar 3.05 @ Falcon - ivar
JPA sürümüyle ilgileniyorum .. JpaTemplate'den kurtulun .. sorununuzu çözmeyecek ama iyi olacak - Premraj


Cevaplar:


Bu genellikle işlem yapılmadığında gerçekleşir. Şüphesiz @ Transactional interceptor düzgün bir şekilde müdahale etmiyor.


26
2018-03-20 20:16



Kontrol edilecek bir şey daha var: @Transactional ek açıklama paketinden org.springframework.transaction.annotation, değil javax.transaction - ikincisi davamda çalışmıyordu. - Gondy


persist() "yönetilen girişlerin listesine nesne ekle" anlamına gelir. Nesneyi veri tabanına kaydetmek için aramanız gerekir flush() yöntem. Ama unutmayın ki işlemin içinde çağırmalısınız.

//Düzenle: Örnek kaydetme yöntemi.

public void save(T t){
    // begin transaction 
    em.getTransaction().begin();
    if (!em.contains(t)) {
        // persist object - add to entity manager
        em.persist(t);
        // flush em - save to DB
        em.flush();
    }
    // commit transaction at all
    em.getTransaction().commit();
}

Bu yapabileceğiniz en iyi şey değil, ama yeterince iyi.


26
2018-03-20 19:22



Her iki işlemden önce flush () çağrılır. - bestsss
EntityManager.flush () eklendi ve javax.persistence.TransactionRequiredException eklendi: işlem yapılmıyor - ivar
Ivar bak baskısı - Koziołek
bir tane daha. JpaTemplate javax.persistance.EntityManager için sadece cephe. - Koziołek
To save object to data base you must call flush() method. - gerçekten değil .. "Yapmalısın" demek daha iyidir sanırım. - Koray Tugay


Kontrol edin mvc-dispatcher-servlet.xml . Burada <context:component-scan base-package="pass"/> geçiş, denetleyicilerinizin bulunduğu pakete eşit olmalıdır


0
2018-05-25 19:33