2011-07-28 22 views
7

Mój problem dotyczy odłączonych obiektów ...Trwałość obiektu w stanie hibernacji, gdy znany jest klucz podstawowy.

Obecnie używam Spring z Hibernate.

Mam zmapowany obiekt, który ma klucz podstawowy jako ciąg (wiem, że jest do bani ... ale refaktoryzacja kodu zajęłaby miesiące), a ja chcę go utrzymać. (Mam uproszczone obiekt z zaledwie dwóch atrybutów)

@Id 
private String id; 

private String pattern; 

Tak na przykład chcę dodać coś takiego:

[ "id": "myFirstPattern", "wzór": "*"]

Zauważ, że mój klucz podstawowy jest już ustawiony. Problem polega na tym, że za każdym razem, gdy próbuję kontynuować, Hibernate spróbuje połączyć ten obiekt z dowolnym obiektem w kontekście (z powodu klucza podstawowego) i nie uda się tego zrobić, ponieważ nie ma go. Zgłaszanie błędu odłączonego obiektu.

Zrobiłem kilka badań i doszedłem do wniosku, że scalenie() będzie wystarczające dla moich potrzeb, ponieważ utrzymuje się i aktualizuje, nawet jeśli obiekt nie jest dostępny. Jednak znalazłem to raczej brudne rozwiązanie i chciałem sprawdzić, czy są jakieś inne rozwiązania tego problemu.

Weź pod uwagę, że mamy warstwę Pomocnika, więc warstwa Usługi nie będzie działać bezpośrednio z warstwą HibernateDao. Mogę więc "zamaskować" to, dodając metody "persist" i "update", które wywołają tę samą metodę DAO łączenia.

Dzięki, Flavio.

+0

Cześć Flavio, czy możesz wysłać swoją konfigurację mapowania hibernacji? Czy możesz potwierdzić, że mapowanie Hibernacji działa w celu pobrania obiektów z bazy danych? – Caps

+0

org.hibernate.dialect.MySQL5Dialect walidacji false false false 0 net.sf. ehcache.hibernate.SingletonEhCacheProvider

+0

\t \t \t \t \t \t \t \t \t \t

Odpowiedz

1

Czy próbowałeś saveOrUpdate?

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    session.saveOrUpdate(yourObjectHere); 

    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 
+0

Próbowałem użyć SaveOrUpdate, ale wierzę, że moja buforowana baza danych łączy się z JUnit, ponieważ niektóre dane ręcznie usuwam poprzez kwerendy sql. Wciąż otrzymuję błędy StaleStateException, gdy próbuję utrzymać ten sam obiekt po raz drugi po usunięciu go w teście wcześniej. Jest mało prawdopodobne, że zrobimy ręczne usuwanie, ale wciąż dlatego JUnits są tam, aby przetestować wszystko. –

0

Nie jestem pewien, i nie mogę spróbować go sobie teraz, ale nie ustawienie właściwości @Id używania generatora "assigned" zrobić dokładnie to?

+0

Nie mogłem znaleźć żadnych konkretnych w @ID, mimo że znalazłem innych w GeneratedId, etc ... Nie jestem pewien, w jaki sposób to mi pomoże. Strategie GeneratedValue są powiązane z DB? Pracowałem z nimi wcześniej, ale wszystkie moje wcześniejsze doświadczenia dotyczyły znormalizowanych DB ... –

1

Próbowałem użyć innego podejścia po tym, jak wypróbowałem ideę, którą mi dał Mauricio. Ponieważ SaveOrUpdate korzystał z obiektów buforowanych do sprawdzenia, czy powinien zaktualizować lub zapisać obiekt, o którym myślałem, że powinien zrobić to tuż przed zapisaniem obiektu.

tak, tutaj jest mój kawałek kodu:

try { 
     getHibernateTemplate().clear(); 
     getHibernateTemplate().save(entity); 
    } catch (DataAccessException e) { 
     if (e.getCause() instanceof ConstraintViolationException) 
      throw new HibernateDaoException("Entity could not be persisted. Constraint violation."); 
     throw new HibernateDaoException(e); 
    } 

Na razie to działa zgodnie z oczekiwaniami, choć wydaje się, że będzie ona zabić mojego pamięci podręcznej bazy danych powód do istnienia tej funkcji, jednak ... aktualizacji będą używane oszczędnie, ponieważ głównym powodem działania komponentu jest zwracanie informacji, dopasowywanie wzorców i zwracanie najlepszych wyników.

W każdym razie wrócę wkrótce, jeśli znajdę jakieś usterki.

Wszelkie komentarze, prosimy o ich publikację :)

Powiązane problemy