EntityManager persist () не сохраняет ничего в базу данных - PullRequest
27 голосов
/ 20 марта 2011

Мой entityManager persist () получает идентификатор из последовательности и помещает его в мой объект Image, но сам объект Image не отображается в базе данных. EntityManager.flush () выдает ошибку, поэтому я не могу зафиксировать этот путь. Вот мой код

@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" />

Ответы [ 5 ]

28 голосов
/ 20 марта 2011

Это обычно происходит, когда транзакция не применяется .. Я сомневаюсь, что перехватчик @Transactional не перехватывает должным образом.

27 голосов
/ 20 марта 2011

persist() означает «добавить объект в список управляемых записей».Для сохранения объекта в базу данных необходимо вызвать метод flush().Но помните, что вы должны вызывать внутри транзакции.

// Редактировать: Пример метода сохранения.

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();
}

Это не лучшее, что вы можете сделать, но достаточно хорошее.

1 голос
/ 30 января 2019

Проверьте журналы вашего сервера. Вы создаете новый EntityManger? и не начали сделку. Я думаю, где вы начали, это еще один EntityManager объект.

0 голосов
/ 23 октября 2018

Я столкнулся с этой проблемой при запуске тестовых случаев с SpringJUnit4ClassRunner

Я решил это оборачивая тестовую функцию с

@Autowired
private PlatformTransactionManager transactionManager;

// in your test funciton 
// Declare a transaction programmatically to be able to rollback.
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);

try {
    // here test of Dao goes
} finally {
    transactionManager.rollback(transaction);
}

надеюсь, это поможет вам

0 голосов
/ 25 мая 2016

Проверьте свой mvc-dispatcher-servlet.xml. Здесь <context:component-scan base-package="pass"/> pass должно быть равно пакету, где ваши контроллеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...