Hallo,
ich habe eine von Spring verwaltete Anwendung, in der ich die Daten mit JPA (Hibernate) speichern will. Ich habe folgende Schnittstelle definiert:
Und ich habe zwei Klassen, die zusammen diese Schnittstelle umsetzen:
Der relevante Teil der Spring-Konfiguration:
Wenn ich nun in der Anwendung ein Page-Objekt erzeuge und add übergebe, bekomme ich die Meldung:
Wenn ich em.flush() auskommentiere, passiert einfach nichts. Dabei sollte man doch eigentlich auch ohne diesen expliziten Aufruf auskommen oder? In der DB landet in keinem Fall etwas.
Was mache ich falsch? Ich dachte Spring kümmert sich selbst um die Transaktion? Standardmäßig sollte @Transactional auch mit propagation_required konfiguriert sein, so dass eine neue Transaktion gestartet werden müsste?
Was mache ich falsch? Wie kriege ich den Datensatz in die DB?
Gruß
Christian
ich habe eine von Spring verwaltete Anwendung, in der ich die Daten mit JPA (Hibernate) speichern will. Ich habe folgende Schnittstelle definiert:
Code:
@Transactional
public interface IPageRepository
{
void add(Page page);
}
Und ich habe zwei Klassen, die zusammen diese Schnittstelle umsetzen:
Code:
public abstract class Repository<T>
{
protected EntityManager em;
@PersistenceContext
void setEntityManager(EntityManager em)
{
this.em = em;
}
public abstract void add(T t);
}
public class PageRepository extends Repository<Page> implements IPageRepository
{
@Override
public void add(Page page)
{
page.setAuthor("anonymous");
page.setRevisionDate(new Date());
em.merge(page);
em.flush();
}
}
Der relevante Teil der Spring-Konfiguration:
Code:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
</bean>
</property>
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
Wenn ich nun in der Anwendung ein Page-Objekt erzeuge und add übergebe, bekomme ich die Meldung:
Code:
javax.persistence.TransactionRequiredException: no transaction is in progress
Was mache ich falsch? Ich dachte Spring kümmert sich selbst um die Transaktion? Standardmäßig sollte @Transactional auch mit propagation_required konfiguriert sein, so dass eine neue Transaktion gestartet werden müsste?
Was mache ich falsch? Wie kriege ich den Datensatz in die DB?
Gruß
Christian