Hibernate 模型 class 和辅助方法最佳实践

Hibernate model class and helper method best practices

请考虑以下(部分)class:

@Entity
@Table(name = "account", catalog = "storeman", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class Account implements java.io.Serializable {

    private Integer id;
    private String email;
    private String displayName;

    ...

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() {
        return this.id;
    }

    @Column(name = "email", unique = true, nullable = false, length = 80)
    public String getEmail() {
        return this.email;
    }

    @Column(name = "display_name", nullable = false, length = 50)
    public String getDisplayName() {
        return this.displayName;
    }

    public static Account lookup(String email, Session session){
        return (Account)
                session.createCriteria(Account.class)
                .add(Restrictions.eq("email", email))
                .uniqueResult();
    }
}

如您所见,它映射了使用id作为主键的mydb的account table。但是,在数据库中搜索帐户时,我想使用电子邮件作为选择标准。为此,我添加了一个名为 lookup 的静态方法来执行我的查询。据我所知,这很好用。 但是我想问一下,在使用休眠(使用 JDBC 的动态 Web 项目)时,这种方法是否是好的做法,以及这会带来什么样的问题(如果有的话)。

如果您创建一个 DAO 会更好class为您的模型帐户说 AccountDAO 并将查找方法移至 AccountDAO。

在我的书中传递 session(或 EntityManager,或几乎任何其他服务对象)并不是好的做法。这样做足够多,您会发现自己在收集和控制调用数据库的位置时遇到困难。 Service-对象应该是 "using" 数据对象,而不是相反。

正确的做法是创建一个 Repository 服务,其中包含获取 session/EntityManager 的方法,以及为此 [=22= 执行 JPA 操作的方法]区。

因此,我会将查询移出实体 class,并移至存储库(调用此方法的 class,即保存会话的存储库,听起来像是一个地方开始。)