Mam do czynienia z dość złożonym wykresem obiektów w mojej bazie danych. Używam XStream do serializacji i deserializacji tego wykresu obiektów, który działa dobrze. Kiedy importuję wykres obiektów obiektu istniejącego w bazie danych, jest on początkowo przejściowy, ponieważ nie ma żadnych identyfikatorów i hibernacja nic o nim nie wie. Następnie mam logikę biznesową, która ustawia identyfikatory na częściach mojego wykresu obiektów, poprzez ustalenie, które obiekty w nowo transjentowanej mapie obiektów importowanych do istniejących obiektów trwałych. Następnie używam funkcji scalania Hibernate() i saveOrUpdate().Użycie elementu Transient w hibernacji do aktualizacji/scalenia istniejącego obiektu trwałego
Niektóre pseudokod dać lepsze wyobrażenie o tym, co robię:
ComplexObject transObj = xstream.import("object.xml");
ComplexObject persistObj = someService.getObjByName(transObj.getName());
for (OtherObject o : c.getObjects()) {
if (persistObj.getObjects().contains(o.getName())) {
o.setId(persistObj.getObjectByName(o.getName()).getId())
}
... set a bunch of other IDs deeper in the object graph ...
}
transObj = session.merge(transObj);
session.saveOrUpdate(transObj);
Teraz to nie działa tak jak pojawiają się błędy takie jak:
org.springframework.dao.InvalidDataAccessApiUsageException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.......SomeObject#353296]
i wydaje się, Łączenie hibernacji nie było przeznaczone do powiązania obiektów przejściowych z trwałymi.
Czy jest jakiś sposób osiągnięcia tego, co chcę zrobić, bez konieczności uzyskiwania trwałego obiektu w sesji i modyfikowania go, zamiast modyfikowania przejściowego, i próby zapisania tego i zastąpienia istniejącego trwałego?
To jak bym rozwiązał go: http://stackoverflow.com/questions/4779239/update-persistent-object-with-transient-object-using-hibernate - ze względu na wydajność zalecana albo cache dane odbicie/introspekcja lub utworzyć generator klasy od twoich jednostek. – user1050755
Posiadanie setId jest zawsze złym pomysłem ...? – Rob
user1050755, jedyną rzeczą w tym rozwiązaniu jest to, że nie jest w stanie poradzić sobie z skomplikowanymi kaskadami, jeden-do-wielu, itd. Myślę, że to działałoby tylko dla struktury nie-graficznej, ale popraw mnie jeśli 'Mylę. – eipark