2013-08-20 75 views
9

Używam Hibernate 3.3.1 i chciałbym utworzyć relację między osobami i przypisaną firmą. Powinny być luźno powiązane, ale chciałbym zorganizować , aby utworzyć firmę przez kaskadę i nie jawnie wywołując saveOrUpdate (newCompany).Hibernate @ManyToOne działa tylko z CascadeType.ALL

I zdefiniowano następujące podmioty:

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

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

wewnątrz mojego dao robie co następuje:

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

i uzyskać wyjątek

org.hibernate.TransientObjectException: odwołuje się do niezapisanej instancji przejściowej - zapisz instancję przejściową przed opróżnieniem: consearch.model.core.Company

Podczas nanoszenia z "kaskady = CascadeType.ALL" to działa, ale nie chcę, aby także ccade Usunięcie (np jeśli firma zostanie usunięta, osoba nie powinna zostać usunięta)

Zastanawiam się, że nikt nie miał tego problemu przed Z góry dziękuję za pomoc. Shane

Odpowiedz

10

Prawdopodobnie musisz włączyć Hibernuj niestandardowy @Cascade, używając metody innej niż JPA Session.saveOrUpdate().
Dodaj @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) lub użyj Session.persist()

+0

To było dokładnie to właściwa odpowiedź, po dodaniu adnotacji @Cascade , działało zgodnie z oczekiwaniami! wielkie dzięki! – Shannon

+0

Witamy w SO. Jeśli jedna z poniższych odpowiedzi rozwiąże problem, powinieneś ją zaakceptować (kliknij znak wyboru obok odpowiedniej odpowiedzi). To robi dwie rzeczy. Dzięki temu każdy wie, że Twój problem został rozwiązany, i daje osobie, która pomaga ci w przyznaniu pomocy. Aby uzyskać pełne wyjaśnienie, przeczytaj [tutaj] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235). –

+0

@bellabax Jak doszło do tego rozwiązania? Czy jest to opisane w dokumentacji hibernacji? Czy możesz wskazać, gdzie dokładnie opisano ten problem, zwłaszcza dlaczego tak się dzieje? Znalazłem to http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/, ale nie jest zbyt blisko, aby zrozumieć, nie patrząc na źródło hibernacji. – jhegedus

-1

ja nie czuję mapowania rację

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; 
} 

Set jak to teraz

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);