我有一个以下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注释?
Session.load()在这种情况下,Hibernate提供了一种称为(相当混乱)的方法。
Session.load()
Session.load()返回具有给定标识符的惰性代理,而无需查询数据库(如果具有给定标识符的对象已被加载到current中Session,则它本身返回一个对象)。
Session
您可以使用该代理初始化要保存的实体中的关系:
category.setParent(session.load(Category.class, parent_id));
请注意,此代码不会检查Category具有给定ID的是否存在。但是,如果您的数据库架构中有外键约束,则在传入无效ID时会收到违反约束的错误。
Category
等效于此方法的JPA称为EntityManager.getReference()。
EntityManager.getReference()