Wpis z mikrobloga

Mam encję User która ma w sobie taką kolekcję:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "userid", nullable = false)
private Set<UserRole> userRoles;

A ta encja userRole wygląda tak:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "role
id")
private Role role;

@Column(name = "roleid", insertable = false, updatable = false)
private Integer roled;

@Column(name = "user
id", insertable = false, updatable = false)
private Integer userId;

Mam taki problem, że w momencie w którym zapisuje nowego użytkownika do bazy i dodaje mu listę ról, to przypisuję obiektom UserRole id istniejących już w bazie ról. Niestety działa to tak, że zamiast przypisać istniejącą rolę z podanym id, hibernate tworzy nową rolę w bazie z innym id.

Da się to jakoś ogarnąć, czy muszę raczej w trakcie tworzenia usera, pobrać sobie najpierw te role z bazy i przypisać je do userrole przed zapisem?

I sorki, że niejasno to tu może opisałem ale niewygodnie mi się tu pisze, nie umiem nawet okienka tekstowego powiększyć.

#programowanie #java #hibernate
  • 1
@Murasame: By hibernate nie tworzył nowych obiektów Role, trzeba użyć polecenia merge() w celu połączenia istniejącego obiektu Role z bazą danych. Następnie trzeba ustawić cascade na merge() dla encji UserRole, aby hibernate przeprowadził tę operację automatycznie w trakcie tworzenia usera i dodawania listy ról.

Przykładowo:

@OneToMany(cascade = CascadeType.MERGE, orphanRemoval = true)
@JoinColumn(name = "userid", nullable = false)
private Set<UserRole> userRoles;