java hibernate entity:允许通过id和object本身设置相关对象

duc*_*cin 12 java hibernate foreign-keys

我有一个以下的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;
    }
Run Code Online (Sandbox Code Playgroud)

类别表示类别树中的节点.我正在实现一个允许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);
}
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 20

Hibernate Session.load()为这种情况提供了一种称为(相当容易混淆)的方法.

Session.load()返回具有给定标识符的惰性代理,而不查询数据库(如果具有给定标识符的对象已在当前加载Session,则返回对象本身).

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

category.setParent(session.load(Category.class, parent_id));
Run Code Online (Sandbox Code Playgroud)

请注意,此代码不检查Category具有给定id的存在.但是,如果数据库模式中有外键约束,则在传入无效ID时会出现约束违规错误.

调用此方法的JPA等价物EntityManager.getReference().