2011-07-22 17 views
7

mam object A który mapuje table A w DBaktualizowania pola obiektu w hibernacji

class A { 
    Integer id; 
    String field2,field2;field3 ,... fieldN; 
    //lots of other attribute 
} 

Teraz chcę napisać API DAO że tylko aktualizuje pojedynczy podejście field.One jest, że mogę najpierw załadować obiekt następnie zmienia atrybut mi potrzeba, a następnie użyć połączyć API

//start transcation 
A a = session.load(A.class, id); 
A.setfieldP(newValue) 
session.merge(A) 
//commit transcation 

teraz, jeśli używam następujący kod

//start transcation 
A a = new A(); 
a.setId(id); //set a id by which object A exists in DB 
A.setfieldP(newValue) 
session.merge(A) 
//commit transaction 

Teraz drugie podejście do wszystkich pól, z wyjątkiem id i pólP, jest ustawione na wartość null

1) Czy istnieje inne podejście?
2) Czy mogę używać aktualizacji zamiast scalania?

Odpowiedz

2

Zwykle wolę session.get vs session.load, jako session.get will return null w przeciwieństwie do zgłaszania wyjątku, ale zależy to od pożądanego zachowania.

ładowania obiektu, ustanawiając swoje pole i dzwoni albo

session.merge(myObject) 

to standardowy sposób, chociaż można również użyć

session.saveOrUpdate(myObject) 

dopóki obiekt nie został oderwany, który w twoim przypadku nie zostanie odłączony. Here is a good article wyjaśniając różnice w scalaniu i saveOrUpdate.

W swoim drugim przykładzie edytujesz klucz podstawowy obiektu? Jest to ogólnie zła forma, należy usunąć i wstawić zamiast zmieniać klucz podstawowy.

+0

Prawdopodobnie już to wiesz, ale saveOrUpdate działa z odłączonymi obiektami. Jedyny raz, gdy napotkasz na kłopoty z nim, jest wtedy, gdy istnieje istniejący obiekt o tym samym identyfikatorze dołączony do sesji. –

+0

'saveOrUpdate' zaktualizuje wartości do istniejącego obiektu w db (+1) – bluefoot

+0

@Russ Sanwald: W drugim podejściu, co próbuję zrobić, chcę zaktualizować obiekt. Teraz za aktualizację nie chcę go pobrać to z db, a następnie aktualizuję, zamiast tego tworzę nowy obiekt A, ustaw jego klucz podstawowy i poleN, a następnie aktualizuję. Ustawiam klucz podstawowy, ponieważ chcę zaktualizować obiekt za pomocą klucza podstawowego = X (zakładając, że obiekt o identyfikatorze x jest już obecne w DB i ustawiam fieldN tak, jak chcę go zaktualizować.Nie zmieniam klucza głównego, ale moim celem jest zmiana wartości pola N obiektu A za pomocą Id = X – akshay

13

Jeśli trzeba aktualizować wiele podmiotów jednocześnie najbardziej skutecznym sposobem jest użycie zapytania:

Query query = session.createQuery("update EntityName set fieldP = 'newValue' " 
     + "where id IN (75, 76)"); 
query.executeUpdate(); 

ta pozwala na zmianę wartości pola bez ładowania podmiot lub podmioty do pamięci.

Najlepiej jest używać nazwanych zapytań i nazwanych parametrów - powyższa implementacja jest tylko przykładem.

+0

można to uznać za podtekst tego pytania. – bluefoot

+6

Nie zgadzam się. Po pierwsze, poprosił o inne podejście, jeśli takie było. Po drugie, z drugiego fragmentu kodu wyraźnie widać, że chce uniknąć ładowania encji do pamięci. –

0

Jeszcze jedna optymalizacja może polegać na ustawieniu aktualizacji dynamicznej na wartość true dla jednostki. Zapewni to, że zawsze, gdy pojawi się aktualizacja, tylko zmienione pola zostaną zaktualizowane.

+0

jest konieczne pobranie obiektu najpierw z db, a następnie aktualizacja. Co zrobić, jeśli utworzę nowy obiekt o identyfikatorze X, a następnie ustawię tylko te pola, które chcę zaktualizować? W moim podejściu 2 wszystkie pozostałe, które nie są ustawione, są przechowywane jako nulls, chcę, aby zachował stare nie wartości null – akshay

2

Za pomocą JPA możesz zrobić to w ten sposób.

CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class); 
Root<User> root = criteria.from(User.class); 
criteria.set(root.get("fname"), user.getName()); 
criteria.set(root.get("lname"), user.getlastName()); 
criteria.where(builder.equal(root.get("id"), user.getId())); 
session.createQuery(criteria).executeUpdate(); 
Powiązane problemy