一尘不染

Java Hibernate实体:允许通过ID和对象本身设置相关对象

hibernate

我有一个以下Java类,它也是一个Hibernate实体:

@Entity
@Table(name = "category")
public class Category {

    @ManyToOne
    @JoinColumn(name="parent_id")
    private Category parent;

    public Category getParent() {
        return parent;
    }

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

类别表示类别树中的节点。我正在实现一个允许CRUD类别的Web服务。例如,该接口具有创建类别树节点的功能,并且可以将类别ID作为参数传递。

我只想创建一个新的Category对象,并将其持久化到数据库中,而无需获取父对象。我的数据提供程序类如下所示:

public void createCategory(int parent_id, String name, CategoryType type) {
    Category category = new Category();
    category.setName(name);
    // category.setParent(?); <- I don't have this object here
    // category.setParentId(id); <- but I do have the id
    category.setType(type);
    this.categoryDao.save(category);
}

我的问题是:如果假设我不会调用hibernate来为我获取父项(那将是愚蠢的),该怎么办才能创建一个新的Category对象并设置parent_id?我可以为Category类提供setParentId
/ getParentId方法吗?它会有什么hibernate注释?


阅读 306

收藏
2020-06-20

共1个答案

一尘不染

Session.load()在这种情况下,Hibernate提供了一种称为(相当混乱)的方法。

Session.load()返回具有给定标识符的惰性代理,而无需查询数据库(如果具有给定标识符的对象已被加载到current中Session,则它本身返回一个对象)。

您可以使用该代理初始化要保存的实体中的关系:

category.setParent(session.load(Category.class, parent_id));

请注意,此代码不会检查Category具有给定ID的是否存在。但是,如果您的数据库架构中有外键约束,则在传入无效ID时会收到违反约束的错误。

等效于此方法的JPA称为EntityManager.getReference()

2020-06-20