Cześć. Jestem po kursie Hibernate w którym omówione zostały relacje pomiędzy encjami. Wykładowca omawiając relację, powiedzmy OneToOne BI-Directional robił to tak, że w miejsce klucza obcego wrzucał cały obiekt innej klasy. Dopóki pracowaliśmy w czystym Hibernacie i wywoływaliśmy wszystko w main(), to wszystko grało, jednak przenosząc te zasady na REST Api pojawiają się pewne problemy.
Jako, że obiekt ActivationCode posiada w sobie obiekt User, a User posiada w sobie obiekt ActivationCode, próbując wyciągnąć z bazy dane dochodzi do nieskończonej rekurencji i Stackoverflow Error.
ActivationCode.class
@Entity
@Table(name="activation_code")
public class ActivationCode {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_activation_code")
private int id_activation_code;
@Column(name="serial_number")
private String serial_number;
@OneToOne(mappedBy="id_activation_code", cascade= {CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH })
private User user;
public ActivationCode() {
}
}
User.class
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_user")
private int id_user;
@OneToOne(cascade={CascadeType.DETACH,
CascadeType.MERGE,
CascadeType.PERSIST,
CascadeType.REFRESH})
@JoinColumn(name="id_activation_code")
private ActivationCode id_activation_code;
@Column(name="user_name")
private String user_name;
@Column(name="user_surname")
private String user_surname;
@Column(name="user_email")
private String user_email;
@Column(name="user_password")
private String user_password;
@Column(name="user_phone_number")
private String user_phone_number;
@Column(name="user_car")
private String user_car;
@Column(name="user_description")
private String user_description;
@Column(name="is_active")
private boolean is_active;
@OneToMany(mappedBy="id_user",
cascade= {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
private List<Seat> listOfUserSeats;
public User() {
}
}
Pobawiłem się trochę JsonIgnore i wynik jest już ciekawszy, jednak chciałbym w swoim wyniku mieć otrzymać JSON'a, w którym zamiast obiektu User dostałbym jego ID. Czy ktoś wie jak to zrobić ?
{
"serverResponse": {
"msg": "Code exist in database",
"succesful": true
},
"activationCode": {
"id_activation_code": 1,
"serial_number": "abcd",
"id_user" : 3
}
}
Shalomskoro mapujemy to od razu na obiekt domenowy albo na DTO, to po co w ogóle ten hiberate i te entity?
;)