Я пытаюсь создать простое приложение, используя Spring, JPA и встроенную базу данных H2. Недавно я столкнулся с этой странной проблемой с декларативными транзакциями. Они просто не фиксируются, если я автоматически связываю свой DAO с аннотацией @Repository. В частности, я получаю исключение при сбросе:
javax.persistence.TransactionRequiredException:
Exception Description: No transaction is currently active
Вот моя установка:
постоянство.xml
<persistence-unit name="schedulePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/scheduleDB" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="eclipselink.target-database" value="org.eclipse.persistence.platform.database.H2Platform" />
<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
<property name="eclipselink.logging.level" value="FINE"/>
</properties>
</persistence-unit>
Организация
@Entity
@Table(name = "Professors")
public class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public Professor() { }
public Professor(String name) {
this.name = name;
}
}
ДАО
@Repository
public class JpaDao {
@PersistenceContext
private EntityManager em;
@Transactional
public void addProfessor(Professor professor) {
em.persist(professor);
em.flush();
}
}
database.xml (включен из контекста root spring)
<beans>
<context:component-scan base-package="com.spybot.schedule.dao" />
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="schedulePU" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
Контроллер
@Controller
public class HomeController {
@Inject
JpaDao dao;
@RequestMapping("/add")
public @ResponseBody String add(String name) {
Professor p = new Professor(name);
dao.addProfessor(p);
return ":)";
}
}
А теперь самое интересное. Если я удалю аннотацию @Repository из DAO и укажу ее явно в файле database.xml, все будет работать нормально.
Обновлять
Добавление еще одного <tx:annotation-driven />
в конфигурацию spring servlet решает проблему, но почему?
@Inject
на@Autowired
- person beerbajay   schedule 29.01.2012<tx:annotation-driven/>
в основной контекст тоже сработало для меня. Спасибо. - person Julius   schedule 19.07.2012