如何从另一个实体获取字段的值(Hibernate)

时间:2016-10-11 09:21:01

标签: java spring hibernate jpa

我需要从另一个实体获得字段的价值。我有下一个型号:

@Entity
public class ProductOwnerFields {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String customValue;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "templateField_id")
    private TemplateFields templateFields;

    private int order;
    //gettees and setters
}

@Entity
public class TemplateFields{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "order_field")
    private int order = 0;

    @Column(name = "name")
    private String name;
    //gettees and setters
}

如何获取TemplateFields的字段“ORDER”的值并设置为ProductOwnerFields的字段“ORDER”?我只需要JPA或Hibernate的anotations,使用EntityManager。

总的来说,我需要创建EntityManager.find(ProductOwnerFields .class,id)并使用TemplateFields的“order”中的“order”值获取ProductOwnerFields的对象。

3 个答案:

答案 0 :(得分:1)

可以试试这个:

@Entity
public class ProductOwnerFields {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String customValue;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "templateField_id")
    private TemplateFields templateFields;

    private int order;

    @PostLoad
    public void postLoad() {
        if(templateFields != null) {
            this.order = templateFields.getOrder();
        }
    }
}

这可以回答您的问题,但不建议这样做。 在JPA中,您可以构建CriteriaQuery并直接注入搜索条件" order"领域" templateFields" ProductOwnerFields类型。无需订购"" ProductOwnerFields中的字段。

您可以查看此内容以了解如何使用CriteriaQuery:https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

答案 1 :(得分:1)

当你使用eager时,它包括尽快加载实体或集合, 无论申请是否随后使用它们。

然后你可以使用以下代码获取代码:

productField.getTemplateFields().getOrder()

答案 2 :(得分:0)

尝试类似的东西

@Entity
public class ProductOwnerFields {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String customValue;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "templateField_id")
    private TemplateFields templateFields;

    @OneToOne(fetch = FetchType.EAGER)
    private TemplateFields templateFields;
}

@Entity
public class TemplateFields{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "order_field")
    private int order = 0;

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