2012-04-23 3 views
15

Ich habe zwei Entitäten: PlayerProfileEntity & UserInfoEntity ich auf userInfoEntity einen Join habe & PlaterProfileEntity und meinen Rekord in der Datenbank wie folgt zu speichern:Objekt verweist auf ein nicht gespeicherte transientes Beispiel: die transiente Instanz speichert vor dem Spülen

Session session = sessionFactory.openSession(); 
Transaction tr = session.beginTransaction(); 
Criteria crit = session.createCriteria(PlayerProfileEntity.class); 
player.setUserId(new UserInfoEntity()); 
player.getUserId().setAddress(user.getUserId().getAddress()); 
session.save(player); 
tr.commit(); 

I diese Assosiation in meiner PlayerProfileEntity Klasse verwendet

@ManyToOne (fetch = FetchType.LAZY) 
@Cascade({CascadeType.REFRESH}) 
@JoinColumn(name="userid") 

ich erhalte diese Fehler:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save  the transient instance before flushing: com.shared.entity.UserInfoEntity 

Hinweis: Wenn i CascadeType.All verwenden, erhalte ich diese Fehlermeldung:

Cannot add or update a child row: a foreign key constraint fails 

Jede Idee, wie kann ich dieses Problem lösen

Dank

Antwort

20

Die TransientObjectException kommt immer dann, wenn Sie versuchen, das Objekt zu speichern, ohne die entsprechenden Joins zu speichern. Sie müssen sav e die UserInfoEntity zuerst und danach können Sie Ihre PlayerInfoEntity Klasse speichern.

player.setUserId(new UserInfoEntity()); 

Damit verwenden Sie zuweisen insbesondere UserInfoEntity-PlayerInfoEntity. Aber UserInfoEntity hat keine ID. Wie würden beide abgebildet? Deshalb kommt die Ausnahme.

Ich hoffe, es würde Ihnen helfen.

+0

danke, können Sie führen, wie kann ich userInfoEntity speichern – user1226162

2

Sie sollten die CascadeType.PERSIST verwenden oder CascadeType.ALL

+0

danke, aber ich benutze bereits CascadeType.ALL, wie in meiner Frage erwähnt und bekomme den Fehler: Kann nicht hinzufügen oder aktualisieren eine untergeordnete Zeile: eine Fremdschlüssel-Einschränkung schlägt fehl, jede Idee auf diesem – user1226162

+0

Es tut mir leid, didn ' Ich sehe die Notiz am Ende. Ich denke jedoch, wir sollten uns auf den Fehler konzentrieren, den Sie mit CascadeType.ALL bekommen. –

+0

Sie zeigen eine Zeile mit Kriterien an, die jedoch für Ihren Code nicht relevant ist. Auf der anderen Seite fehlt der wichtige Code, der den 'Player' zusammensetzt, den Sie speichern wollen. Außerdem verwirrt mich diese Zeile: 'player.getUserId(). SetAddress (user.getUserId().getAddress()) 'Was ist der Sinn davon? Und wie kommt es, dass UserId ein zusammengesetztes Objekt ist? –

-1

Nun,

ich simmilar Problem hatte und was ich tat, war

Object tmp = session.get(Object.class,ob.getId()) 
if(tmp!=null){ 
    session.evit(tmp); // or merge 
} 
session.saveOrUpdate(ob); 

Das ist für mich gearbeitet.

Es erhält das transiente Objekt und entfernt es oder verschmilzt es.

Verwenden Sie jetzt die Speicher- oder Aktualisierungsmethode, um Ihr neues Objekt zu speichern.

+1

Sie müssen mehr über diese Lösung zu erklären. Wie löscht das Entfernen und Sparen dieses Problem? In der Regel wird dieses Problem dadurch verursacht, dass * eine Entität nicht gespeichert wird, die an die aktuelle angehängt ist. –

1
public void savePlayerMethod(PlayerInfoEntity player){ 

if(player == null){ 
    player = new PlayerInfoEntity(); 
} 
player.setUserId(getSavedUserInfo()); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 

public UserInfoEntity getSavedUserInfo(){ 
UserInfoEntity userInfo = new UserInfoEntity(); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 
0

traf ich den gleichen Fehler gerade jetzt, wenn ein nicht gespeicherte Objekt zu speichern versuchen, die eine zugewiesene ID durch die Session # save() Methode hatte. Ich denke, das Problem könnte sein, dass Ihr ungespeicherter Objektgraph bereits eine ID erhalten hat (was die save-Methode versucht zu tun), und das verwirrt irgendwie die Kaskade der Speichermethode. Versuchen Sie stattdessen Session # persist() zu verwenden, Kaskade sollte damit arbeiten, obwohl dem Objekt bereits eine ID zugewiesen wurde.

Verwandte Themen