Więc chcesz:
User u1 = new User("Bill");
session.save(u1);
User u2 = new User("Bill");
session.saveOrUpdate(u2);
zauważyć, że U1 i U2 są takie same Bill i przechowywać go tylko raz? Hibernate nie ma możliwości dowiedzenia się, że Rachunki są tą samą osobą. Patrzy tylko na identyfikator User u2, widzi, że nie jest ustawiony, stwierdza, że u2 powinno zostać wstawione, próbuje i zgłasza wyjątek.
SaveOrUpdate utrzymuje zarówno całkowicie nowy obiekt, jak i załadowany obiekt, który jest aktualnie dołączony do sesji. Tak to działa (zakładając, że masz sposób findByName gdzieś istnieje inny atrybut, powiedzmy favoriteColor):
User u1 = new User("Bill");
u1.setFavoriteColor("blue");
session.saveOrUpdate(u1);
User u2 = findByName("Joe");
u2.setFavoriteColor("red");
session.saveOrUpdate(u2);
Ale to nie to, co chcesz, prawda?
Twój problem jest pogarszany przez twój podmiot, który ma zastępczy klucz podstawowy i osobno klucz biznesowy (wymuszony przez ograniczenie unikalności). Jeśli nie masz pola id i tylko wymienić jako klucz podstawowy, można użyć seryjnej() (omówienie saveOrUpdate vs seryjnej, look here):
User u1 = new User("Bill");
u1.setFavoriteColor("blue");
session.save(u1);
User u2 = new User("Bill");
u2.setFavoriteColor("red");
u2 = session.merge(u2);
Ale nie masz, ty Należy wymusić zarówno ograniczenie PK na id i unikalność na nazwę. Będziesz potrzebował pewnej odmiany scalania, która to robi.Z grubsza, chciałbyś coś z tych linii:
public User mergeByName(User user) {
User merged;
User candidate = findByName(user.getName());
if (candidate != null) {
user.setId(candidate.getId());
merged = session.merge(user);
} else {
session.save(user);
merged = user;
}
return merged;
}
Thx za Twoje zaufanie. 'id' jest kluczem podstawowym, a' name' ma unikalny element constriant Mamy klasę obiektu Użytkownik, na przykład: 'Rachunek użytkownika = nowy użytkownik()' i atrybuty dotyczące rachunku, który otrzymujemy od keybord lub strony internetowej, a moje pytanie jest następujące: : W jaki sposób można zrobić saveOrUpdate(), jeśli plik bill.name istnieje w db, który nazywamy update() w przeciwnym razie zapiszemy rachunek. – kunkanwan