Dzień dobry,
Mam mały problem z hibernate. Posiadam 3 klasy. które mapuję do MySql. Chce utworzyć relacje jeden do wielu (Boss- User), tak więc User musi przechowywać w tabeli id Boss-a. Dodaje więc do bazy danych Bossa, następnie tworze użytkownika (User) i przypisuje mu wcześniej stworzonego/zapisanego Bossa po czym zapisuje User-a do bazy i dostaje taki błąd "org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.note.models.Boss".
Niby oczywiste, ale przecież jako pierwszego dodaje Bossa, a potem Usera !
W Bossie ustawiony jest parametr Cascade = Cascade.All .
Mogę więc dodać Usera na podstawie Bossa
boss.getUserSet().add(user);
wtedy nie ma błędu, ale User w tabeli nie zapisuje Id bossa.
Już zgłupiałem kompletnie, wie może ktoś co robię nie tak ?
@MappedSuperclass
public abstract class Person implements Serializable {
@Column(nullable = false,unique = true)
private String nick;
@Column(nullable = false)
private String password;
public Person() {
}
public Person(String nick, String password) {
this.nick = nick;
this.password = password;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public boolean equals(Object o) {
return this.nick.equals(((Person) o).nick);
}
}
@Entity
@Table(name = "BOSS")
public class Boss extends Person {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOSS_SEQ")
@SequenceGenerator(name = "BOSS_SEQ", sequenceName = "BOSS_SEQUENCE",initialValue=0, allocationSize=1)
protected long bossId;
@OneToMany(mappedBy = "boss",cascade = CascadeType.ALL)
private List<User> userSet = new ArrayList<>();
public Boss() {
}
public long getBossId() {
return bossId;
}
public void setBossId(long bossId) {
this.bossId = bossId;
}
public List<User> getUserSet() {
return userSet;
}
public void setUserSet(List<User> userSet) {
this.userSet = userSet;
}
}
@Entity
@Table(name = "USER")
public class User extends Person
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ")
@SequenceGenerator(name = "USER_SEQ", sequenceName = "USER_SEQUENCE",initialValue=0, allocationSize=1)
private long userId;
@OneToMany(mappedBy = "user_id",cascade = CascadeType.ALL)
private Set<Note> listNote = new TreeSet<>();
@ManyToOne
// @Column(nullable = false)
private Boss boss;
public User() {
}
public User(String nick, String password) {
super(nick, password);
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public Boss getBoss() {
return boss;
}
public void setBoss(Boss boss) {
this.boss = boss;
}
public Set<Note> getListNote() {
return listNote;
}
public void setListNote(Set<Note> listNote) {
this.listNote = listNote;
}
}
public class Main
{
public static void main(String[] args)
{
Boss boss = new Boss();
boss.setNick("Proba");
boss.setPassword("password");
Boss boss2 = new Boss();
boss2.setNick("Proba2");
boss2.setPassword("password2");
User user = new User();
user.setNick("Test");
user.setPassword("password");
user.getListNote().add(new Note("Ala ma kota",user));
//boss.getUserSet().add(user);
MainDao.saveInDataBase(boss);
MainDao.saveInDataBase(boss2);
user.setBoss(boss);
MainDao.saveInDataBase(user);
}
}