Многие ко многим отношениям с использованием Spring Boot, Jackson и HibernateJAVA

Программисты JAVA общаются здесь
Anonymous
Многие ко многим отношениям с использованием Spring Boot, Jackson и Hibernate

Сообщение Anonymous »

Я работаю над проектом REST, используя Spring Boot и Hibernate и в настоящее время пытаюсь выяснить, как справиться с моей JSON-сериализацией. < /p>



Схема, показанная в ERD выше, отображается Стрледен и работает нормально. < /P>

Проблема возникает, когда я делаю запрос получить запрос на контроллер. Насколько я понимаю, Spring Now пытается сериализовать цепочку объекта с помощью Джексона. Поскольку как родительские, так и дочерние объекты имеют друг друга в качестве атрибута, мы обнаруживаем, что бьем по бесконечному циклу рекурсии. @JsonManagedReference и @jsonbackReerference, но они, кажется, работают только для отношений с одним ко многим. Получить запрос на/users/{id} , я получаю объект пользователя, включая все атрибуты его отношений (давайте назовем его полным объектом), но сами атрибуты отношений не показывают их атрибуты отношений (минимизированные объекты) Полем Это прекрасно работает с упомянутыми выше аннотациями, но как мне сделать эту работу и наоборот? > < /p>

{ // full user object
id: 1,
username: 'foo',
// password can be JsonIgnored because of obvious reasons
role: { // minimized role object
id: 1,
name: 'bar'
// NO USERS LIST
}
area: { //minimized area object
id: 2,
name: 'some val'
// NO USERS LIST
// NO TABLES LIST
}
}
< /code>

желаемый ответ для /userrole /{id} < /code> < /p>

{ // full role object
id: 1,
name: 'waiter'
users: [
{ // minmized user object
id: 1,
username: 'foo'
// password can be JsonIgnored because of obvious reasons
// NO ROLE OBJECT
// NO AREA OBJECT
},
{ // minmized user object
id: 1,
username: 'foo'
// password can be JsonIgnored because of obvious reasons
// NO ROLE OBJECT
// NO AREA OBJECT
}
]
}
< /code>

В целом: я бы хотел полный объект, когда запрос будет представлен к объекту напрямую и минимизированный объект, когда запрошен косвенно. < /p>

Есть идеи? Я надеюсь, что мое объяснение достаточно ясно. > Область, пользователь и пользователь -pojo, как запрошены в разделе комментариев.@Entity
@Table(name = "users", schema = "public", catalog = "PocketOrder")

public class User {
private int id;
private String username;
private String psswrd;
private List areas;

private UserRole Role;

@Id
@Column(name = "id", nullable = false)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Basic
@Column(name = "username", nullable = false, length = 20)
public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

@Basic
@JsonIgnore
@Column(name = "psswrd", nullable = true, length = 40)
public String getPsswrd() {
return psswrd;
}

public void setPsswrd(String psswrd) {
this.psswrd = psswrd;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

if (id != user.id) return false;
if (username != null ? !username.equals(user.username) : user.username != null) return false;
if (psswrd != null ? !psswrd.equals(user.psswrd) : user.psswrd != null) return false;

return true;
}

@Override
public int hashCode() {
int result = id;
result = 31 * result + (username != null ? username.hashCode() : 0);
result = 31 * result + (psswrd != null ? psswrd.hashCode() : 0);
return result;
}

@ManyToMany(mappedBy = "users")
public List getAreas() {
return areas;
}

public void setAreas(List areas) {
this.areas = areas;
}

@ManyToOne
@JoinColumn(name = "role_fk", referencedColumnName = "id", nullable = false)
public UserRole getRole() {
return Role;
}

public void setRole(UserRole role) {
Role = role;
}
}
< /code>

userrrole < /h3>

@Entity
@javax.persistence.Table(name = "userroles", schema = "public", catalog = "PocketOrder")
public class UserRole {
private int id;
private String name;
private List users;

@Id
@Column(name = "id", nullable = false)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Basic
@Column(name = "name", nullable = false, length = 20)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

UserRole userRole = (UserRole) o;

if (id != userRole.id) return false;
if (name != null ? !name.equals(userRole.name) : userRole.name != null) return false;

return true;
}

@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}

@OneToMany(mappedBy = "role")
public List getUsers() {
return users;
}

public void setUsers(List users) {
users = users;
}
}
< /code>

область < /h3>

@Entity
@javax.persistence.Table(name = "areas", schema = "public", catalog = "PocketOrder")
public class Area {
private int id;
private String name;
private List users;

private List tables;

@Id
@Column(name = "id", nullable = false)
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Basic
@Column(name = "name", nullable = false, length = 20)
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Area area = (Area) o;

if (id != area.id) return false;
if (name != null ? !name.equals(area.name) : area.name != null) return false;

return true;
}

@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}

@ManyToMany
@JoinTable(name = "areas_users", catalog = "PocketOrder", schema = "public", joinColumns = @JoinColumn(name = "area_fk", referencedColumnName = "id", nullable = false), inverseJoinColumns = @JoinColumn(name = "user_fk", referencedColumnName = "id", nullable = false))
public List getUsers() {
return users;
}

public void setUsers(List users) {
this.users = users;
}

@OneToMany(mappedBy = "area")
public List getTables() {
return tables;
}

public void setTables(List tables) {
this.tables = tables;
}
}


Подробнее здесь: https://stackoverflow.com/questions/443 ... -hibernate

Вернуться в «JAVA»