Daten werden nicht gespeichert mit Spring + JPA (Hibernate):

Status
Nicht offen für weitere Antworten.

deamon

Bekanntes Mitglied
Hallo,

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
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
 

deamon

Bekanntes Mitglied
Die Annotation an der konkreten Klasse anzubringen ändert nichts, aber das hätte mich auch gewundert, denn laut Doku soll man die auch an Schnittstellen schreiben können.
 
Zuletzt bearbeitet:

byte

Top Contributor
Unter bestimmten Umständen funktioniert es aber nicht mit Interfaces:

You certainly can place the @Transactional annotation on an interface (or an interface method), but this will only work as you would expect it to if you are using interface-based proxies. The fact that annotations are not inherited means that if you are using class-based proxies (proxy-target-class="true") or the weaving-based aspect (mode="aspectj") then the transaction settings will not be recognised by the proxying/weaving infrastructure and the object will not be wrapped in a transactional proxy (which would be decidedly bad)

The Spring team's recommendation is that you only annotate concrete classes with the @Transactional annotation, as opposed to annotating interfaces.
 

deamon

Bekanntes Mitglied
Danke für den Hinweis! Das Problem war mir gar nicht bewusst. Nur leider ist es nicht das Problem und deshalb auch nicht die Lösung in diesem Fall.

Woran könnte es denn noch liegen, dass die Daten nicht in der DB landen?
 

deamon

Bekanntes Mitglied
Danke, das war's! Ich hatte einfach den falschen TransactionManager. Nun verwende ich folgende Konfiguration:

Code:
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="dataSource" ref="myDataSource"/>
        <property name="entityManagerFactory" ref="emf"/>
    </bean>
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R JSF Daten werden nicht aktualisiert aus Datenbank gelesen Data Tier 3
L JSP Mit Java-Daten von einer Webseite zu ziehen? Data Tier 5
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
R Hibernate daten laden Data Tier 7
S JPA und Versionsmanagement der Daten Data Tier 2
V Daten speichern Data Tier 7
T DB Daten beim Anlegen neuer EntityManagerFactory verloren Data Tier 3
M DB Anwendung - Daten auf ext. Server - Anregungen? Data Tier 5
N JPA Änderungen werden nicht gespeichert Data Tier 2
D Hibernate Tabellen werden nicht mehr erstellt Data Tier 2
R Beim deployen und initialisieren der DB werden Umlaute nicht gespeichert Data Tier 5
N Gerade so viele Parents auswählen, dass mindestens 20 Children angezeigt werden Data Tier 7
A Fehlermeldung: Tabellen werden nicht gefunden Data Tier 2
N Spring / OpenJPA Inheritance: Subklassen werden nicht erkannt Data Tier 4
N Entity-Object muss auf Client aktualisiert werden Data Tier 13
J Umstieg von Wildfly 13->14, JPA 2.1->2.2, schreiben funktioniert nicht mehr Data Tier 10
O JPA Persistieren mit JTA funktioniert nicht Data Tier 0
G JPA kann Objekt nicht löschen Data Tier 4
G Zuweisen von eigenen DB-Verbindungen nicht möglich Data Tier 3
M HibernateTemplate löscht nicht ohne flush() Data Tier 0
S JPA Cascade: Entity nur speichern, wenn sie nicht schon existiert Data Tier 0
E JPA Session.delete einer Entity wird nicht ausgeführt Data Tier 2
Kenan89 9.2-1000 JDBC 4 nicht für Java EE ? Data Tier 3
neonfly <exclude-unlisted-classes>true</exclude-unlisted-classes> mag <class>package.Klasse</class> nicht Data Tier 2
K JPA One2Many-Set erkennt seine Inhalte nicht wieder Data Tier 3
B Datensatz wird nicht in DB geschrieben! Data Tier 2
N Löschen OneToMany Beziehung (delete-orphan) geht nicht Data Tier 2
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
Landei JPA - persist persisted nicht Data Tier 4
D jpa/eclipselink setMaxResults() funktioniert nicht mit MySql?! Data Tier 9
D jpa "pessimistic lock" funktioniert nicht?! Data Tier 11
L Hibernate - Tabelle nicht gemappt!? Data Tier 4
H Log4J loggt Hibernate nicht in Kombination mit Tomcat Data Tier 2
W JPA Persistenz 2x hintereinander funktioniert nicht Data Tier 3
W JPA generiert die Tabellen bzw. die DDL Files nicht Data Tier 6
D Hibernate: Objekt wird nicht gelöscht. Data Tier 5
K Hibernate: OneToOne funktioniert nicht Data Tier 3
D Hibernate schreibt nicht in DB Data Tier 1

Ähnliche Java Themen


Oben