Persistierung in Hibernate(SpringBoot)

ExceptionOfExpectation

Bekanntes Mitglied
Hallo,
angenommen ich habe zwei Klassen:
Java:
@Entity
@Access(AccessType.FIELD)
public class Cover{
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    
    private String title;
    
    @OneToOne(mappedBy="cover")
    private Page page;
    
    //SETTER & GETTER außer setId()
}
--------------------------------------------
@Entity
@Access(AccessType.FIELD)
public class Page{
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    
    @OneToOne
    @JoinColumn(name="cover_fk")
    private Cover cover;
    
    private byte [] textDocument;
    
    //SETTERS & GETTERS außer setId()
    
}
Eine Cover Klasse hat eine Page Klasse und diese Page Klasse besitzt einen Textinhalt, also es kann alles sein: JSON, DOC, TXT order sonst irgend-ein File. Somit ist diese Page Klasse gleichzeitig die "Owning Side" mit dem FremdSchlüssel. Die Cover Klasse, um die bidirektionale Beziehung aufzubauen, besitzt einen Page Feld mit Markierung "mappedBy". Damit habe ich die Beziehung aus dem Datenbank im Code fast vollständig wiedergegeben.

In der Datenbank habe ich überfüllt eine Menge Cover Datensätze, zu jedem Cover Datensatz möchte ich einen Page Datensatz hinzufügen, aber das alles soll auf der Java Seite stattfinden. Das heißt ich müsste jedesmal eine Cover-Entity aufrufen mit Hilfe von entityManager.find(Cover.class, id) und dann ein neues Objekt Page instanziieren, danach dieses Page Objekt zu dem EntityObjekt Cover hinzufügen und dann beide wieder in der Datenbank speichern. Dafür dachte ich die persist() und merge() Methoden zuverwenden in der Reihenfolge, falls die Reihenfolge unwichtig ist, dann bitte gleich Bescheid sagen. Das hat nicht geklappt, ohne @Transactional lief es nicht, also es wurde nichts persistiert. Meine Frage Dazu lautet:
-Wie kann ich die neue Page-Instanziierung zu der Cover-Entity einfügen und es persistieren, ohne eine jegliche Form von Transactional zu verwenden, auch ohne dabei auf JdbcTemplate zugreifen?
 

Oneixee5

Top Contributor
Ich verstehe nicht was du möchtest. In der Überschrift steht "Hibernate" aber "JdbcTemplate" gehört zu Spring Data JDBC. JdbcTemplate benutzt man eh nicht mehr so wirklich, eher JdbcClient. @Transactional ist eine Annotation für public Methoden, deren Inhalt in einer Transaktion ausgeführt wird. Bei Hibernate würde man eher ein flush() verwenden. Zusammengefasst: ich werde nicht so richtig schlau aus deiner Beschreibung.

Die Abfolge für das Speichern von Datensätzen in pure Hibernate wäre etwa so:
Java:
Transaction tx = session.beginTransaction();
try {
    for (int i = 0; i < 100000; i++) {
        MyEntity myEntity = new MyEntity(...);
        session.save(myEntity);
        if (i % 20 == 0) { // 20 -> JDBC batch size
            // flush inserts and release memory:
            session.flush();
            session.clear();
        }
    } 
    tx.commit();
} catch (...) {
    tx.rollback();
    ...
}

Was wird denn wirklich verwendet: Hibernate, JPA, Spring Data JDBC, ...? Alles durcheinander sollte man nicht machen. So ein Projekt wird unwartbar.
 

mihe7

Top Contributor
Das heißt ich müsste jedesmal eine Cover-Entity aufrufen mit Hilfe von entityManager.find(Cover.class, id) und dann ein neues Objekt Page instanziieren, danach dieses Page Objekt zu dem EntityObjekt Cover hinzufügen und dann beide wieder in der Datenbank speichern. Dafür dachte ich die persist() und merge() Methoden zuverwenden in der Reihenfolge, falls die Reihenfolge unwichtig ist, dann bitte gleich Bescheid sagen. Das hat nicht geklappt, ohne @Transactional lief es nicht, also es wurde nichts persistiert.
Nicht ganz/unbedingt. So lange die Entity managed ist, werden Änderungen automatisch (spätestens) am Ende der Transaktion auf die DB abgebildet.

D. h. um eine bereits vorhandene, persistente Entity zu ändern, ist weder persist noch merge erforderlich. Es reicht, die Entity aus der DB zu laden (z. B. mit find oder einer Query) und in der Transaktion zu ändern:
Java:
Cover cover = em.find(Cover.class, id); // liefert eine managed Entity-Instanz vom Typ Cover
cover.setTitle("X");

Ferner muss man Entities und deren Beziehungen unterscheiden. Du hast zwei Entities, Cover und Page, die in einer 1:1-Beziehung zueinander stehen. Mit dem Setzen der Page eines Covers wird lediglich die Beziehung zwischen den Entities festgelegt.

Java:
public void setExistingPage(Long coverId, Long pageId) {
    Cover cover = em.find(Cover.class, coverId);
    Page page = em.find(Page.class, pageId);
    cover.setPage(page);
}

Da dies nur die Beziehung zwischen den Entities betrifft, nicht aber die Page-Entity selbst, können auf diese Weise nicht einfach neue Page-Objekte hinzugefügt werden.

Java:
public void setNewPage(Long coverId) {
    Cover cover = em.find(Cover.class, coverId);
    cover.setPage(new Page());
}

Das führt zunächst zu einem Fehler. Damit das funktioniert, persistiert man entweder das Page-Objekt explizit oder man gibt CascadeType.PERSIST (oder ALL) in Cover für die Beziehung zum Page-Objekt an.
Java:
@Entity
@Access(AccessType.FIELD)
public class Cover{
  
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
  
    private String title;
  
    @OneToOne(mappedBy="cover", cascade=CascadeType.PERSIST)
    private Page page;
  
    //SETTER & GETTER außer setId()
}
 

ExceptionOfExpectation

Bekanntes Mitglied
Nicht ganz/unbedingt. So lange die Entity managed ist, werden Änderungen automatisch (spätestens) am Ende der Transaktion auf die DB abgebildet.

D. h. um eine bereits vorhandene, persistente Entity zu ändern, ist weder persist noch merge erforderlich. Es reicht, die Entity aus der DB zu laden (z. B. mit find oder einer Query) und in der Transaktion zu ändern:
Java:
Cover cover = em.find(Cover.class, id); // liefert eine managed Entity-Instanz vom Typ Cover
cover.setTitle("X");
...
Du magst in dem Fall recht haben, aber das würde bedeuten, dass nach jeder Änderung auf die Datenbank zugegriffen werden müsste.
 

ExceptionOfExpectation

Bekanntes Mitglied
Nö. Das bedeutet nur, dass Du kein explizites merge()/persist() aufrufen musst. Oder meinst Du etwas anderes?
ich meine ich greife nach jedem Update auf die Datenbank und das ist nicht optimal.
Stelle dir vor, du hast aus dem Datenbank ein Objekt geholt und dieses Objekt wird von Client verwendet und verändert, so dass er aus dem persistenten Kontext rausgenommen wird.
Danach speichere ich das Objekt, zwei Zugriffe und dazwischen noch viele Änderungen von Außen.

PS.: ich dachte ich hätte den Beitrag schon vor lange abgeschickt
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Stelle dir vor, du hast aus dem Datenbank ein Objekt geholt und dieses Objekt wird von Client verwendet und verändert, so dass er aus dem persistenten Kontext rausgenommen wird.
Danach speichere ich das Objekt, zwei Zugriffe und dazwischen noch viele Änderungen von Außen.
Naja, es gilt halt wie immer: kommt darauf an. Für Batch-Updates ist das sicher nicht der geeignete Weg.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Type Fehler bei der Speicherung von Entity (Hibernate/h2) Frameworks - Spring, Play, Blade, Vaadin & Co 1
ExceptionOfExpectation Set<Enum> von Hibernate Entity als ENUM(...)ARRAY in der H2-Datenbank speichern Frameworks - Spring, Play, Blade, Vaadin & Co 7
W Kotlin: DB-Relationen in Spring Boot Data / Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 6
H Laden der Hibernate Cfg in .jar Frameworks - Spring, Play, Blade, Vaadin & Co 5
padde479 org.hibernate.query.sqm.UnknownEntityException Frameworks - Spring, Play, Blade, Vaadin & Co 12
OnDemand Jasypt Hibernate 6 alternative gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 3
Avalon @Query Select Abfrage liefert falsche Werte (Spring Boot, JPA, Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 3
D org.hibernate.LazyInitializationException Frameworks - Spring, Play, Blade, Vaadin & Co 2
krgewb Hibernate - deleteByXXX Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Postgres, Hibernate Seqencenummer wird wiederholt und verursacht PK-Fehler Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z JPA, Hibernate, Postgres und Sequence-Nummern Frameworks - Spring, Play, Blade, Vaadin & Co 3
Z Hibernate & Postgres in Spring Boot (Syntaxprobleme) Frameworks - Spring, Play, Blade, Vaadin & Co 2
Z Spring Boot mit JPA;, Hibernate, Rest & Lombok Frameworks - Spring, Play, Blade, Vaadin & Co 8
OnDemand Jasypt Spring Boot HIbernate wie komme ich an den Key? Frameworks - Spring, Play, Blade, Vaadin & Co 4
OnDemand Hibernate Lazy Collection löschen Frameworks - Spring, Play, Blade, Vaadin & Co 7
H Hibernate Sql Abfrage loggen Spring mit log4j.properties Frameworks - Spring, Play, Blade, Vaadin & Co 2
OnDemand DTO <> Entity Hibernate Spring Boot Frameworks - Spring, Play, Blade, Vaadin & Co 28
S Spring JPA / Hibernate: save Methode arbeitet nicht Frameworks - Spring, Play, Blade, Vaadin & Co 2
R Spring Data: Hibernate liest nicht alle Ebenen Frameworks - Spring, Play, Blade, Vaadin & Co 5
S Spring Data Hibernate mehrfache Suchkriterien Frameworks - Spring, Play, Blade, Vaadin & Co 5
H Spring Boot, Hibernate und OAuth2 wie komme ich an den User? Frameworks - Spring, Play, Blade, Vaadin & Co 13
D Spring Hibernate Struts2 ? Frameworks - Spring, Play, Blade, Vaadin & Co 1
F JPA org.hibernate.LazyInitializationException / Spring @Transactional Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Spring, Hibernate und JPA in einem Projekt Frameworks - Spring, Play, Blade, Vaadin & Co 4
I Nachladen mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 2
N MAVEN + Spring + JPA + Hibernate + JUnit4 Frameworks - Spring, Play, Blade, Vaadin & Co 5
E Tomcat mit Hibernate und Spring - Problem mit Connection Pool Frameworks - Spring, Play, Blade, Vaadin & Co 5
P Context initialization failed - mit Spring, JPA, Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B Buchempfehlung für Groovy, Spring, Hibernate, SOAP, J2EE gesucht Frameworks - Spring, Play, Blade, Vaadin & Co 1
D Hibernate - Spring Roo Frameworks - Spring, Play, Blade, Vaadin & Co 0
Dit_ Springsource Toolsuit | Hibernate intergration Frameworks - Spring, Play, Blade, Vaadin & Co 1
J Test mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 5
D [InvalidDataAccessApiUsageException] Spring Data JPA / Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 1
B SpringMVC-EntityManagerFactory-Hibernate-Problem Frameworks - Spring, Play, Blade, Vaadin & Co 1
M Problem mit Hibernate und Spring Frameworks - Spring, Play, Blade, Vaadin & Co 0
R Projektübergreifende Entities mit Tomcat (Spring/JPA/Hibernate) Frameworks - Spring, Play, Blade, Vaadin & Co 2
N Wie manage ich unter Spring mehrere Datenbankverbindung mit Hibernate Frameworks - Spring, Play, Blade, Vaadin & Co 6
Y Sessionmanagement (ThreadLocal) in Hibernate via Spring möglich? Frameworks - Spring, Play, Blade, Vaadin & Co 2
C Aufgabe in OSGI/Hibernate/Spring-DM Frameworks - Spring, Play, Blade, Vaadin & Co 4
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
dunhillone Problem mit Spring & Hibernate Sessions Frameworks - Spring, Play, Blade, Vaadin & Co 2
B Spring / Jpa / Hibernate -> java.lang.IllegalArgumentException: Unknown entity Frameworks - Spring, Play, Blade, Vaadin & Co 1
S Hibernate und JDBC über Spring Frameworks - Spring, Play, Blade, Vaadin & Co 3
ExceptionOfExpectation Desktop-Window in SpringBoot Frameworks - Spring, Play, Blade, Vaadin & Co 12
S java springboot HTML Produktstruktur Frameworks - Spring, Play, Blade, Vaadin & Co 1
G Java springboot Item mit ItemInstance verbinden Frameworks - Spring, Play, Blade, Vaadin & Co 2
ExceptionOfExpectation @Value() für application.properties [SpringBoot] Frameworks - Spring, Play, Blade, Vaadin & Co 9
Zrebna SpringBoot: Einfache RestAPI konsumieren gelingt nicht. Frameworks - Spring, Play, Blade, Vaadin & Co 6
Zrebna SpringBoot-Project: java.sql.SQLSyntaxErrorException: Access denied for user 'gap3'@'%' to database '3306/gap3' Frameworks - Spring, Play, Blade, Vaadin & Co 3
D SpringBoot Properties und Docker Frameworks - Spring, Play, Blade, Vaadin & Co 8
Dimax SpringBoot native Querry return ArrayList Frameworks - Spring, Play, Blade, Vaadin & Co 6
OnDemand SpringBoot Logrotation funktioniert nicht Frameworks - Spring, Play, Blade, Vaadin & Co 6
Robertop Springboot Server kann Jakarta Persistence Root nicht installieren? Frameworks - Spring, Play, Blade, Vaadin & Co 0
G SpringBoot MVC Frameworks - Spring, Play, Blade, Vaadin & Co 1
tom.j85 SpringBoot Rest-Application funktioniert nicht - Keine Fehlermeldungen Frameworks - Spring, Play, Blade, Vaadin & Co 13
V SpringBoot/Thymeleaf ein Attribut zum Controller schicken Frameworks - Spring, Play, Blade, Vaadin & Co 10
L OpenJFX, SpringBoot und Gradle Frameworks - Spring, Play, Blade, Vaadin & Co 12
L SpringBoot Web Application Frameworks - Spring, Play, Blade, Vaadin & Co 1
S SpringBoot MySQL not run Frameworks - Spring, Play, Blade, Vaadin & Co 5
B Springboot und LDAP - Authentifizieren gegen Gruppe Frameworks - Spring, Play, Blade, Vaadin & Co 3
R Authentifizieren mit SpringBoot Frameworks - Spring, Play, Blade, Vaadin & Co 4
M Günstigste oder kostenlose Variante SpringBoot Application laufen zu lassen Frameworks - Spring, Play, Blade, Vaadin & Co 7
Z Springboot - Hauptklasse nicht gefunden Frameworks - Spring, Play, Blade, Vaadin & Co 5
A SpringCloud | SpringBoot | Eureka Frameworks - Spring, Play, Blade, Vaadin & Co 0

Ähnliche Java Themen

Neue Themen


Oben