我对@JsonIdentityInfo
有疑问。我在json文件中获得了两个id。
{
"name" : "Tim",
"@id" : 1, // fasterxml garbage
"id" : 3,
"company" : {
"name" : "Microsoft",
"employees" : [1], // garbage too
"@id" : 2, // fasterxml garbage
"id" : 3
}
}
这是我的实体:
@Entity
@Table(name = "company")
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")
public class Company implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column
private String name;
@OneToMany(mappedBy = "company")
@Cascade(value = CascadeType.ALL)
private Collection<Employee> employees;
如何删除不必要的ID?
UPD:
我正在使用com.fasterxml.jackson
答案 0 :(得分:2)
这是一个老问题,你现在可能已经得到了答案,但是通过阅读它,看起来你的问题来自你使用的生成器。
IntSequenceGenerator
会让杰克逊生成自动递增的ID,并且您指定要将它们作为id
属性(并且因为您已经拥有id
属性,我猜这&#39为什么杰克逊产生@id
)。你想要的是杰克逊使用你现有的id
财产,为此你只需要使用PropertyGenerator
。
您还需要在注释上使用scope
属性,并在Employee
类上使用它,因为您有两个独立的 id 序列。< / p>
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Company.class)
public class Company {}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Employee.class)
public class Employee {}
这应该为您的示例生成
{
"name" : "Tim",
"id" : 3,
"company" : {
"name" : "Microsoft",
"employees" : [3],
"id" : 3
}
}
答案 1 :(得分:0)
您可以使用这样的JSON注释来忽略它们:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties({"id", "name"})
创建JSON对象时,“id”和“name”不在JSON对象中。