【问题标题】:Fetch parent-id in a bidirectional hibernate mapping在双向休眠映射中获取父 ID
【发布时间】:2017-10-19 19:25:14
【问题描述】:

我有一个 spring rest 应用程序,其中包含两个具有双向关系的实体(一对多、多对一)。为了克服嵌套获取问题,@JsonManagedReference/@JsonBackReference 已用于实体之间的关联/子关系。

实体如下所示:

@Entity
@Table(name = "Parent")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Parent implements java.io.Serializable {

    private Integer id;
    private List<Child> childList;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
    @JsonManagedReference
    public List<Child> getChildList() {
        return childList;
    }

    public void setChildListe(List<Child> childListe) {
            this.childList = childList;
        }

    }


@Entity
@Table(name = "Child")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Child implements java.io.Serializable {


    private Integer id;
    private Parent parent;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "ID", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ParentID")
    @JsonBackReference
    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }


}

这在获取 Parent 元素时可以正常工作,然后将子集一起获取并显示为 json-array。

但是,由于使用了 jsonbackreference,子元素中没有对 parent 的引用。

当通过 rest 请求单个子元素时,我想在 json 响应中获取附加到子元素的父对象,或者至少获取父 id。

所有的反馈都会被采纳:)

【问题讨论】:

  • 我也得解决这个问题
  • 这类问题通常源于您的设计问题。如果没有机会进行重构,也许您可​​以将父 ID 显式添加到子 ID - 而不是完整的反向引用。

标签: json spring hibernate rest


【解决方案1】:

我遇到了类似的问题,我通过使用自定义序列化器/反序列化器解决了它

这就是我的做法(请根据您自己的代码进行调整):

ChildSerializer

public class ChildSerializer extends StdSerializer<Child> {

    private static final long serialVersionUID = -265706839304575646L;
    public ChildSerializer(Class<Child> t) {
        super(t);
    }
    public ChildSerializer() {
        this(null);
    }
    @Override
    public void serialize(Child child, JsonGenerator jg, SerializerProvider sp)
            throws IOException, JsonGenerationException {

        jg.writeStartObject();
        jg.writeStringField("name", child.getName());
        jg.writeStringField("surname", child.getSurname());
        Parent parent = child.getParent();
        jg.writeObjectFieldStart("parent");
        jg.writeStringField("name", parent.getName());
        jg.writeStringField("surname", parent.getSurname());
        jg.writeEndObject();
    }
}

儿童

@JsonSerialize(using = ChildSerializer.class)
public class Child implements Serializable {

    private static final long serialVersionUID = 7902561110976676934L;
    private String name;
    private String surname;
    private Parent parent;

    public Child(String name, String surname, Parent parent) {
        this(name, surname);
        this.parent = parent;
    }
    public Child(String name, String surname) {
        this();
        this.name = name;
        this.surname = surname;
    }
    public Child() {
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
    public Parent getParent() {
        return parent;
    }
    public void setParent(Parent parent) {
        this.parent = parent;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((parent == null) ? 0 : parent.hashCode());
        result = prime * result + ((surname == null) ? 0 : surname.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Child other = (Child) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (parent == null) {
            if (other.parent != null)
                return false;
        } else if (!parent.equals(other.parent))
            return false;
        if (surname == null) {
            if (other.surname != null)
                return false;
        } else if (!surname.equals(other.surname))
            return false;
        return true;
    }
}

家长

public class Parent implements Serializable {

    private static final long serialVersionUID = -5604725691780073247L;
    private String name;
    private String surname;
    private List<Child> childs;

    public Parent(String name, String surname) {
        this();
        this.name = name;
        this.surname = surname;
    }
    public Parent(String name, String surname, List<Child> childs) {
        this(name, surname);

        this.childs = childs;
    }
    public Parent() {
        super();
        childs = new ArrayList<Child>();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
    public void addChild( Child child )
    {
        if( !childs.contains(child) )
        {
            child.setParent(this);
            childs.add(child);
        }
    }
    public List<Child> getChilds() {
        return childs;
    }
    public void setChilds(List<Child> childs) {
        this.childs = childs;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((childs == null) ? 0 : childs.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((surname == null) ? 0 : surname.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Parent other = (Parent) obj;
        if (childs == null) {
            if (other.childs != null)
                return false;
        } else if (!childs.equals(other.childs))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (surname == null) {
            if (other.surname != null)
                return false;
        } else if (!surname.equals(other.surname))
            return false;
        return true;
    }

}

我的测试方法:

@Test
public void testJson()
{
    try 
    {
        Parent p = new Parent(UUID.randomUUID().toString(), UUID.randomUUID().toString());
        for (int i = 0; i < 10; i++) {
            p.addChild(new Child(UUID.randomUUID().toString(), UUID.randomUUID().toString()));
        }
        ObjectMapper om = new ObjectMapper();
        String childJson = om.writeValueAsString(p.getChilds().get(0));
        System.out.println(childJson);
    } catch (Exception e) 
    {
        e.printStackTrace();
    }
}

最终的输出是:

{"name":"b86eab86-9858-4536-9c5c-d44d22810fc1","surname":"9a6249f0-58df-44e5-a1b9-31fbad6e9f49","parent":{"name":"74b0cd97-64a1-4547-ab22-4e4eedd0759b","surname":"a33c79f3-6f26-478b-9e24-7df96b3b1f68"}}

遗憾的是,注释功能强大,但并不总是能让您获得所需的内容,因此您必须“自己”完成

希望对你有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多