JPA vs Hibernate.cfg und Entitymanager

dmike

Bekanntes Mitglied
Ich habe gerade ein Problem mit dem Wegschreiben von Instanzen in die Datenbank wobei ich den Entitymanager von JPA 2.0 verwenden möchte.

Die Instanz um die es geht hat intern eine Liste (ein HashSet) mit Kind-Instanzen.

Also z.B. in der Art:

Mother mother = new Mother();
mother.addChild(new Child("child #1"));
mother.addChild(new Child("child #2"));

Jedesmal, wenn per mother.addChild() ein Kind hinzugefügt wird, wird dessen setMother() Methode aufgerufen und eine Verbindung zur Mother Instanz hergestellt.

Java:
class Mother {
  public void addChild(Child child) {
     this.children.add(child);
     child.setMother(this);
  }
}

Nun kann es aber passieren, dass zum Beispiel "child #2" bereits in der Datenbank existiert. Daher suche ich in der Datenbank zuerst nach den vorhandenen Kindern, wenn ich welche finde, dann werden diese sofort der Mutter zugewiesen mother.addChild(childFromDatabase). Neue Kinder werden per "mother.add(new Child(child #n))" wie oben gezeigt hinzugefügt.

Jetzt habe ich mal zwei Alternative durchgespielt:

Zum einen verwende ich den

a) JPA EntityManager und konfiguriere ihn über eine Hibernate Konfiguration.

b) Beim zweiten mal nehme ich den EntityManager und benutze aber eine reine JPA 2.0 Konfiguration.

Das Object "mother", dass ich in die Datenbank schreiben möchte, lässt sich nur mit a) persistieren (also plain Hibernate)

Über b) bekomme ich ein "detached entity passed to persist error" und damit ist eins der Kinder gemeint, dass sich bereits in der Datenbank befindet.

In beiden Fällen machen ich ein "em.persist(mother)" (em = EntityManager Instanz)


Vielleicht sieht ja jemand was genau das Problem ist. Liegt's an der Transaktion?

Den EntityManager für Hibernate konfigurier ich so:

EntityManager em = Persistence.createEntityManagerFactory("hbm.conf").createEntityManager();

Das ist die Hibernate Konfiguration hbm.conf

[XML]
<hibernate-configuration>
<session-factory name="moreevent">
<!-- postgreSQL configuration -->
<property name="connection.url">${jdbc.url}/${jdbc.db.name}</property>
<property name="connection.driver_class">${jdbc.driver}</property>
<property name="connection.username">${jdbc.user}</property>
<property name="connection.password">${jdbc.password}</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<!-- property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property-->

<!-- Session handling -->
<property name="current_session_context_class">thread</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.connection.autocommit">true</property>

<!-- Connection Pool -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

<!-- Debug Ausgaben de/aktivieren -->

<!-- Diese Einstellung aktiviert die Uebergabe der SQL-Statements an log4j -->
<property name="show_sql">true</property>

<!-- Diese Einstellung sorgt bei der SQL-Ausgabe für eine schoene Formatierung.
Siehe auch log4j.xml wo die Log-Einstellungen für Hibernate SQL gesetzt werden.
-->
<property name="format_sql">true</property>

<!-- Die Einstellung ergaenzt einen Kommentar, der anzeigt durch welche HQL oder Criteria-Abfrage das SQL erzeugt wurde. -->
<property name="use_sql_coments">true</property>

<!-- Annotation - Mapping -->
<property name="transaction.auto_close_session">true</property>
<property name="transaction.flush_before_completion">true</property>


</session-factory>
</hibernate-configuration>
[/XML]



Den EntityManager für JPA instanziere ich über Spring's DI

[XML]
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="pgsql_integration_local_testing" />
<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>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}/${jdbc.db.name}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

[/XML]
 
Zuletzt bearbeitet:
B

bananenkasper

Gast
"detached entity" bedeutet normalerweise, dass der Entity zuerst mit dem Persitence Manager synchronisiert werden muss.

Das geht mit EntityManager.merge(entity).
 

dmike

Bekanntes Mitglied
AFAIK muss man den Entitymanager explizit closen oder clearen damit eine Instanz detached wird. So lange das nicht passiert lebt das Objekt im Persistence Context, ist also attached.
Ich habe in beiden Fällen den gleichen Code (nur die Konfiguration ist anders: einmal direkt über die hbm.conf das andere mal über spring). Was ich nicht ganz verstehe ist, warum es überhaupt zum detached kommen kann. Ich mache ja nirgends ein close oder so was.

Im konkreten Beispiel ist Mother = TextResource und Child = TextResourceType
.

Und so erhält jede TextResource eine Liste von TextResourceTypes
Java:
   @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, fetch = FetchType.EAGER)
    @JoinTable(name = "TEXT_RESOURCE_WITH_TYPE", joinColumns = { @JoinColumn(name = "TEXT_RESOURCE_ID") }, inverseJoinColumns = { @JoinColumn(name = "TEXT_RESOURCE_TYPE_ID") })
    private Set<TextResourceType> textResourceTypes = new HashSet<TextResourceType>();




Der Code sieht so aus. Bei Aufruf von em.persist gibts die Exception.



Java:
@Transactional(propagation=Propagation.REQUIRED)
private void fillTables() {

 for (TextResource textResourceFromXML : textResourcesFromXML) {
                Set<TextResourceType> typesFromXML = textResourceFromXML.getTextResourceTypes();
                Set<TextResourceType> typesForDB = new HashSet<TextResourceType>();

                for (TextResourceType typeFromXML : typesFromXML) {
                    TextResourceType typeFromDB = textResourceTypeRepo.findOne(TextResourceType.$.type.eq(typeFromXML.getType()));
                    if (typeFromDB!=null) {
                        log.debug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  FOUND: " + typeFromDB.getDescription());
                        typesForDB.add(typeFromDB);
                    } else {
                        typesForDB.add(typeFromXML);
                    }
                }

                TextResource databaseTextResource = new TextResource(textResourceFromXML.getKey()
                                                                   , textResourceFromXML.getLanguageCode()
                                                                   , textResourceFromXML.getValue()
                                                                   , typesForDB);


                em.persist(databaseTextResource);
            }
} //eof filltables
 

AFlieger

Mitglied
Hallo Mike,

verwendest du in beiden Fällen einund denselben Persistence Provider?
da kann es mämlich durchaus unterschiede geben und sich das Verhalten erklären lassen.
 

dmike

Bekanntes Mitglied
Hallo Mike,

verwendest du in beiden Fällen einund denselben Persistence Provider?
da kann es mämlich durchaus unterschiede geben und sich das Verhalten erklären lassen.

Ja, schon das ist beides mal Hibernate (auch die Version ist identisch)

Ich vermute, dass irgendwo irgendwer die Session schliesst, ich versteh halt bloss noch nicht wer das macht, denn eigentlich steuert ja die umgebende Transaktion den Gesamtablauf. Wie es dann trotz laufender Transaktion zu detachten Objekten kommen kann ist schon merkwürdig.
 

AFlieger

Mitglied
Hi Mike,
wie ich sehe, verwendest du unterschiedliche Transaction-Manager.

Versuch im zweiten Beispiel mal den

anstatt
org.springframework.orm.jpa.JpaTransactionManager

den für Hibernate

org.springframework.orm.hibernate.HibernateTransactionManager

Das fällt mir jetzt auf die Schnelle ein.
 

dmike

Bekanntes Mitglied
Hi Mike,
wie ich sehe, verwendest du unterschiedliche Transaction-Manager.

Versuch im zweiten Beispiel mal den

anstatt
org.springframework.orm.jpa.JpaTransactionManager

den für Hibernate

org.springframework.orm.hibernate.HibernateTransactionManager

Das fällt mir jetzt auf die Schnelle ein.

Jep, das ist es gewesen. Super danke!
Ich werde die Tage die XML Konfiguration dazu posten.
wobei ich hibernate3 benutze... also...
org.springframework.orm.hibernate3.HibernateTransactionManager


Wohl doch zu früh gefreut:

object is an unsaved transient instance - save the transient instance before merging: de.mm.moreevent.types.TextResource

D.h. ich muss mich darum kümmern in welcher Reihenfolge ich den von einaner abhängigen Objete in die Datenbank schreibe. Eigentlich nicht das was ich von CascadeType.PERSIST, CascadeType.MERGE erwarte. Mir kommts so vor als würden die Annotations in den Klassen nicht beachtet.

Aber merkwürdig ist das alles schon. In einem Fall reicht ein em.persist und im anderen muss ich mit persist und merge arbeiten.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Hibernate: Session vs EntityManager Data Tier 3
S [Hibernate] No Persistence provider for EntityManager Data Tier 5
T Hibernate/Spring JPA: eigene ID generieren Data Tier 5
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
D Hibernate Hibernate mit MariaDB Data Tier 1
ToBJo Hibernate Glassfish deploy mit Hibernate schlägt fehl Data Tier 1
C JPA Hibernate Map<String,String> richtig mappen Data Tier 2
S JPA Hibernate Search & EclipseLink (oder OpenJPA) Data Tier 0
R JPA Probleme mit Wechsel von EclipseLink auf Hibernate Data Tier 4
ARadauer Hibernate Entität readonly laden... Data Tier 1
G Hibernate SQL in Hibernate: Keine Parameter mit Index? Data Tier 2
P Wildfly + Hibernate + SQL Server Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
M Eclipse 4 RCP Hibernate Problem Data Tier 3
C Hibernate ProgressBar updaten mit Daten aus Hibernate Data Tier 4
B Hibernate und MySQL testen Data Tier 8
I Hibernate HQL: generiertes SQL ausgeben Data Tier 1
R mapping-file für hibernate zum Überschreiben der Annotationen Data Tier 7
R Hibernate Hibernate und Logback Data Tier 2
R Hibernate möchte Schema zwei mal undeployen Data Tier 2
F Hibernate Hibernate / JPA Data Tier 4
C Hibernate Hibernate Code Generation Data Tier 3
S Hibernate Mehrfachverbindung mit Hibernate Data Tier 3
M Hibernate Einstiegsfrage Data Tier 5
M Exception in thread "main" org.hibernate.MappingException: java.lang.ClassNotFoundException: Message Data Tier 4
S Hibernate Einstieg in Hibernate 3.2 sinnvoll? Data Tier 8
P JPA Eigene Vererbungsstrategie mit JPA / Hibernate Data Tier 2
J Hibernate Problem bei Master-Detail-Tabellen Data Tier 5
Y Jboss seam-hibernate-jpa Data Tier 5
RaoulDuke Hibernate Map<String,String> mit Annotations mappen Data Tier 2
M Hibernate Hibernate with GWT Data Tier 4
C Hibernate JPA mysql db erstellen Data Tier 4
M Hibernate Hibernate liest Daten zu oft aus! Data Tier 16
pg1337 Hibernate Fragen Data Tier 11
D Probleme bei Left Joins mit Hibernate createCriterias() Data Tier 2
D Hibernate probleme mit Verlinkungstabelle Data Tier 4
2 Hibernate Annotations Data Tier 7
G Hibernate select update no wait Data Tier 8
Z Hibernate: Many-To-Many nur eine bestimmte Spalte Data Tier 3
K Hibernate - Envers - Erzeugung der SQL Skripte Data Tier 4
G Hibernate 1:n Beziehung mit Vererbung Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
L Hibernate: failed to lazily initialize a collection of role Data Tier 3
S Hibernate hibernate.cfg.xml Data Tier 14
H Hibernate - Mapping für Enumeration Data Tier 1
R Hibernate Criteria Abfrageproblem Data Tier 2
A Hibernate und jdbc zusammen Data Tier 4
D Mit Hibernate aus JUnit ein DB-Schema erzeugen Data Tier 6
B Problem mit org.hibernate.LazyInitializationException Data Tier 11
G Hibernate HQL und Interface Data Tier 4
G JSF Hibernate no session or session was closed Data Tier 12
T JPA2/Hibernate: Many-to-Many-Relation wird u.a. beim löschen nicht aktualisiert Data Tier 14
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
X [Hibernate] Zusammengesetzte Entities möglich? Data Tier 7
N Hibernate Fake? Data Tier 2
S Problem beim Insert mit Hibernate Data Tier 9
V Hibernate Projection Data Tier 2
T org.hibernate.impl.SessionFactoryImpl Memory Leak Data Tier 10
G Hibernate Composite key Data Tier 11
X [Hibernate] Connection Pool - MinSize ? Data Tier 2
R Hibernate Criteria OR Data Tier 2
T hibernate/jpa abgefragte Listen immer mit Null-Werten gefüllt Data Tier 8
X [Hibernate] Anderen Connection Pool - Vorschläge? Data Tier 3
ARadauer Hibernate DDL Loggen Data Tier 6
G Hibernate abfrage Collection Data Tier 3
X [Hibernate] ReverseEngineering - Eigene Strategy verwenden? Data Tier 3
R Hibernate Criteria .group größer als Data Tier 5
R Hibernate daten laden Data Tier 7
H [Hibernate]1:1 Beziehung Data Tier 8
H [Hibernate]No CurrentSessionContext configured! Data Tier 6
X [Hibernate] Lässt sich die Dauer eines SELECTs loggen? Data Tier 4
R Hibernate n:n Relationtabelle mit Date Data Tier 3
H [Hibernate] Unknown Entity Data Tier 3
H [Hibernate] Configuration Data Tier 3
C [Hibernate] Generierung von hbm.xml to Java Data Tier 4
lumo Eclipse & JPA & Hibernate & Derby Data Tier 5
J Zufallsauswahl aus ResultList bei JPA(Hibernate) / Performance Data Tier 3
M Hibernate: Datum 0001-01-01 erzeugt null-Datum Data Tier 4
G Datenbankzugriff mit Hibernate Data Tier 7
Y Hibernate - Angabe des Schemas Data Tier 6
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M Hibernate Mehr als 1 Object speichern? Data Tier 18
M Unerklärliche Hibernate Exception Data Tier 20
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9
haemi Viele DTOs in hibernate IdentityMap Data Tier 3
LadyMilka (hibernate) UNION dem Dialekt hinzufügen Data Tier 3
M Hibernate + Oracle 10g XE Data Tier 3
lumo Hibernate - entity class not found Data Tier 5
P SQL PRoblem Hibernate? Data Tier 8
J Vererbung mit JPA / Hibernate - pro/contra Data Tier 3
T JBoss/Hibernate: Abfrage dauert lang + hohe CPU? Data Tier 19
7 Hibernate-Abfrage (SubSelect im FROM) Data Tier 2
G Hibernate: many-to-one - Verwaiste Datensätze löschen Data Tier 2
G Layer für Datenbankzugriff Hibernate Data Tier 5
G Hibernate Zwischentabelle Data Tier 2
Java.getSkill() Hibernate und Spalte vom Typ xml Data Tier 6
G Hibernate 0...1 : 1 Beziehung Data Tier 6
G Hibernate mehrere @oneToone Data Tier 2
G Hibernate 1:n, 1:1 Data Tier 26
E Hibernate: Unlogische Exception bei Tabellengeneriung Data Tier 12

Ähnliche Java Themen

Neue Themen


Oben