3

实体保存映射到来自持久存储的数据的数据。通常这是数据库。

您可以持有 id:

class Book {
    private String title;
    public String getTitleId() { return title; }

    private Long publisherId;   // <==  **it is**!
    public Long getPublisherId() { return publisherId; }

    private List<Long> authorIds;
    public List<Long> getAuthorIds() { return authorIds; }
}

或已解决的实体:

class Book {
    private String title;
    public String getTitleId() { return title; }

    private Publisher publisher;   // <==  **it is**!
    public Publisher getPublisher() { return publisher; }

    private List<Author> authors;
    public List<Author> getAuthors() { return authors; }
}

如果您使用像 Hibernate 这样的 ORM,则使用已解析的实体很简单,就像 ORM 一样 *免费为您加入*s 与相关实体。

但是,如果您关心性能或想要使用 DB 功能通过手动 SQL 查询将逻辑从 Java 移动到 SQL,那么具有 id 的实体会获胜(它们更快,并且手动加入每个相关实体很烦人)!

因此,我决定维护两种类型的实体:带有 id 和已解析的相关实体,以在数据类型(类型名称)中保存这些知识。

所以我开始在谷歌上搜索类名的最佳后缀,但找不到合适的关键字。请告诉我如何命名方法/技术以在实体中保存ID 相关实体!

4

1 回答 1

3

我认为您正在寻找的条款是

渴望与延迟加载获取策略

编辑:

延迟加载的实体可以称为代理,将尚未初始化的集合称为包装器

对评论的回应:参见Hibernate one-to-one: getId() without fetching entire object。Hibernate 可以为延迟加载的实体生成 ID 值。

休眠常见问题解答

如何在不获取关联的情况下检索关联对象的标识符?

去做就对了。以下代码不会产生任何 SELECT 语句,即使项目关联是惰性的。

Long itemId = bid.getItem().getId();

如果getItem()返回代理并且您使用常规访问器方法映射标识符属性,则此方法有效。如果您为 Item 的 id 启用了直接字段访问,则在您调用时将初始化 Item 代理getId()。然后将此方法视为代理的任何其他业务方法,如果调用它则需要初始化。

于 2013-05-21T13:37:01.517 回答