2013-08-20 34 views
9

Sto utilizzando Hibernate 3.3.1 e vorrei creare una relazione tra persone e un'azienda assegnata. Dovrebbero essere accoppiati liberamente, ma mi piacerebbe organizzare per creare una società via cascata e non chiamare esplicitamente saveOrUpdate (newCompany).Hibernate @ManyToOne funziona solo con CascadeType.ALL

ho definito le seguenti entità:

class Company 
{ 
    @Id 
    Long companyId; 
    String name; 
} 

class Person 
{ 
    @Id 
    Long personId; 
    String name; 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) 
    Company company; 
} 

dentro la mia dao che sto facendo la seguente:

testpers.setCompany (newCompany); 
session.saveOrUpdate(testpers); 

e ottengo un'eccezione

org.hibernate.TransientObjectException: l'oggetto fa riferimento a un'istanza transitoria non salvata - salva l'istanza transitoria prima dello svuotamento: consearch.model.core.Company

Quando indicandoli con "cascade = CascadeType.ALL" Funziona, ma io non voglio anche ccade Soppressione (per esempio se una società viene rimossa, la persona non deve essere rimossa)

Mi chiedevo che nessuno avesse avuto questo problema prima di Grazie in anticipo per avermi aiutato. Shane

risposta

10

Probabilmente è necessario abilitare Hibernate personalizzato @Cascade quando si utilizza il metodo non JPA Session.saveOrUpdate().
Aggiungere @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) o utilizzare Session.persist()

+0

Questo era esattamente la risposta giusta, dopo aver aggiunto l'annotazione @Cascade , ha funzionato come previsto! molte grazie! – Shannon

+0

Benvenuti in SO. Se una delle risposte seguenti risolve il problema, devi accettarlo (fai clic sul segno di spunta accanto alla risposta appropriata). Questo fa due cose. Permette a tutti di sapere che il tuo problema è stato risolto, e dà la persona che ti aiuta ad accreditare l'assistenza. Vedi [here] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) per una spiegazione completa –

+0

@bellabax Come sei arrivato con questa soluzione? È descritto nella documentazione di ibernazione? Potresti per favore indicare un riferimento in cui questo problema è descritto in dettaglio, specialmente perché questo sta accadendo? Ho trovato questo http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/ ma non è molto est da capire senza guardare la fonte di ibernazione. – jhegedus

-1

non mi sento le mappature sono di destra

class Company 
{ 
@Id 
Long companyId; 
String name; 
@OneToMany(fetch = FetchType.LAZY,mappedBy="company" 
@Cascade({CascadeType.SAVE_UPDATE}) 
List<Person> persons; 
} 

class Person 
{ 
@Id 
Long personId; 
String name; 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name="company_id") 
Company company; 
} 

Imposta come questo ora

Company c=new Company(); 
List<Person> plist=new ArrayList<>(); 
Person p=new Person(); 
p.setCompany(c); 
plist.add(p); 
c.setPersons(plist); 
dao.save(c);