如何在春天开发JPA双向实体

时间:2016-04-26 03:16:09

标签: jpa spring-boot

我是春季启动和jpa / hibernate的新手,请承担我对术语的不正确使用。

我有两个实体:书和地址。一本书在某个城市出版,存储在“地址”中,“地址”可以出版多本书。 书的数据库架构是:id,name,author,price,addressid 地址模式:addressid,addressCountry,addressCity 书的实体:

@Entity
@Table(name = "test_book")
public class Book implements Serializable {
private static final long serialVersionUID = 8025948150436422040L;
@Id
long id;

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

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

@Column(name = "price")
long price;

@ManyToOne
@JoinColumn(name = "addressid")
private Address address;
...//getter and setter

地址实体

@Entity
@Table(name = "test_address")
public class Address implements Serializable{
private static final long serialVersionUID = -3541059157210384355L;
@Id
@Column(name= "addressid")
private long addressId;

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

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

@OneToMany(mappedBy = "address")
private Collection<Book> books;
...//getter setter

但是当我打电话给Restful服务时,我会得到无限循环......

[{“id”:11,“name”:“Java Book”,“author”:“Jame Gosling”,“price”:100,“address”:{“addressId”:1,“addressCountry”: “中国”,“地址城市”:“上海”,“书籍”:[{“id”:11,“名称”:“Java书”,“作者”:“Jame Gosling”,“价格”:100,“地址“:...

我做了一些搜索。我的要求是: 当我搜索一本书时,我可以获得这些信息:id,name,author,price,address .. 而且我也可以查询地址以获得该城市出版的所有书籍。 当我在地址中添加Json Annotation @JsonManagedReference和书本实体中的@JsonBackReference时,我可以查询书籍但无法获取地址信息。

请问您如何解决问题?非常感谢你。

2 个答案:

答案 0 :(得分:0)

您可以忽略图书的getter上的@JsonIgnore。这将排除Collection<Book> books属性序列化地址。

链接:JacksonAnnotations - Faster XML Wiki

示例:

@JsonIgnore
public Collection<Book> getBooks() {
...
}

答案 1 :(得分:0)

  

<强> @JsonIgnore

     

杰克逊的注释@JsonIgnore用来告诉杰克逊忽略了   Java对象的某些属性(字段)。该属性被忽略   在将JSON读入Java对象时,以及在编写Java时   将对象转换为JSON。

在你的情况下,这是因为存在双向关系而发生,因此它将进入循环。要阻止这种情况,您需要提供JsonIgnore

所以你的代码就像:

- &GT;地址实体

@Entity
@Table(name = "test_address")
public class Address implements Serializable{
private static final long serialVersionUID = -3541059157210384355L;
@Id
@Column(name= "addressid")
private long addressId;

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

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

@OneToMany(mappedBy = "address")
@JsonIgnore
private Collection<Book> books;