Hibernate Insert/Update - 2 Tabellen, ein Insert?

Lampe

Erfahrenes Mitglied
Hallo,

ich habe zwei Tabellen die miteinander verknüpft sind.

Besitzer ----> Adresse

Folgende Relationen habe ich in die XML Dateien geschrieben:

Address.hbm.xml
Code:
<id name="idAddress" column="idAddress">
   <generator class="increment"/>
</id>
<property name="street" column="Street" type="string"/>
...
...
<one-to-one name="owner" class="cr.dipl.datapool.bean.Owner"/>

Owner.hbm.xml
Code:
<id name="idOwner" column="idOwner">
    <generator class="increment"/>
</id>
...
...
<one-to-one name="address" class="cr.dipl.datapool.bean.Address"/>


Wenn ich nun einen neuen Benutzer hinzufüge, dann will ich auch automatisch die Adresse für den Benutzer einfügen, siehe Beispiel:

Beispiel:
Code:
		Address address = new Address();
		address.setCity("Berlin");
		address.setCityCode(10245);
		address.setCountry("Berlin");
		address.setStreet("Simon-Dach-Strasse");
		address.setHouseNumber("77");
		
		Owner owner = new Owner();
		owner.setSalutation("Herr");
		owner.setFirstName("testStefan");
		owner.setSecondName("testMeyer");
		owner.setFirmName("Luftland");
	        owner.setAddress(address);
		
		session.save(owner);

Dies funktioniert aber leider nicht, wie geht denn das?

Danke
 
Du musst auf der one-to-one Beziehung noch einen CascadeType definieren. Persist und Merge sollte definiert seinen, damit die Referenz bei einem Insert bzw. Update mit angelegt wird.

Gruß
Ollie
 
Bei einem Cascade-All erhalte ich folgende Exception:

Code:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails (`TrackJack/Owner`, 
CONSTRAINT `fk_Owner_Address` FOREIGN KEY (`Address_idAddress`) 
REFERENCES `Address` (`idAddress`) ON DELETE CASCADE ON UPDATE CASCADE)
 
Hast Du nicht ein kurzes Beispiel, vllt. einen Link zu einem Tutorial?

Z.Z. erhalte ich nämlich folgenden Fehler:

Code:
org.hibernate.TransientObjectException: object references an unsaved transient 
instance - save the transient instance before flushing: cr.dipl.datapool.bean.Address
 
Hi, also es kommt darauf an ob du es in den Test laufen lässt oder in der Anwendung selber!

In Tests hast du oft ein Session flush problem!
Der Fehler, zumindest der erste entsteht, weil die Adresse ja noch nicht in der Datenbank ist!

Hier mal en Auszug aus meinen Test:

Java:
Job jobTemp = new Job();
Job jobTemp = new Job();
jobTemp.setJobname("Tollwood");
jobTemp.setCustomer(customer1);
jobTemp.setState(JobState.NEW);
Promoter promoterTemp = new Promoter();
promoterTemp.setPassword("huhu");
promoterTemp.setUsername("hans");
promoterTemp.setPromotername("Hansibert");
jobTemp.getPromoters().add(promoterTemp);

SessionFactoryUtils.getSession(sessionFactory, false).flush();
int restId = jobDAO.save(jobTemp);


oder speicher mal die Adresse nach der erzeugung, dann weiss sie zu und speicher nochmal deine Person!

Ansonsten brav auf Ollihören und dir nochmal das mit dem Cascade anschauen.
Ist es wichtig das alles sofort nachgeladen wird, oder reicht es bei Benötigung, dann wäre das eben mim flush zu testen!

Viel Erfolg!
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück