2016-03-16 12 views
5

mam następujące dwie tabele w mojej bazy danych:Hibernate: wstawić dane z klucz obcy

Kalendarz (id, nazwa, user_id)

użytkownika (id, nazwa, ...)

Każdy kalendarz jest własnością jednego użytkownika, każdy użytkownik może mieć wiele kalendarzy. Stąd istnieje relacja wiele do jednego z Kalendarza do Użytkownika. Teraz chciałbym wstawić zestaw danych na moim stole Kalendarz Mój Kalendarz Podmiot wygląda następująco:

@Entity 
@Table(name = "calendar") 
public class Calendar { 

    @Id 
    @GeneratedValue(generator = "uuid2") 
    @GenericGenerator(name = "uuid2", strategy = "uuid2") 
    @Column(name = "id", columnDefinition = "BINARY(16)") 
    private UUID id; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne 
    @JoinColumn(name = "owner", referencedColumnName = "id") 
    private User owner; 
    ... 
} 

Jednak kiedy jestem włożeniu zestawu danych, wiem id właściciela, ale don nie ma odpowiedniego obiektu User. Czy muszę pobrać obiekt User, ustawić dla niego owner, a następnie wstawić zestaw danych?

To brzmi dla mnie niewygodnie, czy istnieje sposób na wstawienie zestawu danych przy użyciu identyfikatora User, który byłby przechowywany w bazie danych, w przeciwieństwie do obiektu User?

+0

Możliwy duplikat [Hibernacja - jak zaoszczędzić rodzica z dzieckiem jednorodzinnym] (http: // stackoverflow .com/questions/32130703/hibernate-how-to-save-parent-with-detached-child) –

Odpowiedz

1

można uzyskać instancję User proxy z identyfikatorem danego właściciela (jest to tanie działanie). Następnie użyć tej wartości jako instancję Właściciel:

User dummy = hibernateTemplate.load(User.class, ID); //entityManager.getReference or session.load should do the trick too 
calendar.setOwner(dummy); 
hibernateTemplate.save(calendar) 
+0

Problem z tym podejściem polega na tym, że hibernacja aktualizuje również obiekt użytkownika, więc wszystkie jego dane oprócz identyfikatora będą być zresetowany. Czy istnieje sposób na dezaktywację tego zachowania? – user2035039

+0

poprawiono odpowiedź, próbowałem :) – Cootri

+1

Próbowałem tego uniknąć, ale domyślam się, że nie ma innej drogi. – user2035039

0

Wystarczy umieścić nowy User do swojej Calendar:

Calendar c = new Calendar(); 
c.setOwner(new User(id));