Ответ 1
Это обычно происходит, когда транзакция не применяется. Я сомневаюсь, что перехватчик @Transactional не перехватывает должным образом.
Мой 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" />
Это обычно происходит, когда транзакция не применяется. Я сомневаюсь, что перехватчик @Transactional не перехватывает должным образом.
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();
}
Это не лучшее, что вы можете сделать, но достаточно хорошо.
Проверьте mvc-dispatcher-servlet.xml
. Здесь в <context:component-scan base-package="pass"/>
проход должен равняться пакету, где ваши контроллеры
Я столкнулся с этой проблемой при запуске тестовых случаев с 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);
}
надеюсь, это поможет вам
Проверьте журналы вашего сервера. Вы создаете новый EntityManger
? и не начали сделку. Я думаю, где вы начали, это еще один объект EntityManager
.