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

时间:2015-01-23 11:34:55

标签: java hibernate jdbc

请考虑以下(部分)课程:

@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();
    }
}

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

2 个答案:

答案 0 :(得分:1)

如果你为你的模型账户创建一个DAO类说AccountDAO并将查找方法移到AccountDAO会更好。

答案 1 :(得分:1)

在我的书中传递session(或EntityManager或几乎任何其他服务对象)并不是一种好习惯。这样就足够了,你会发现自己在收集和控制数据库调用的地方时遇到了麻烦。 Service - 对象应该是"使用"数据对象,而不是相反。

正确的做法是创建一个Repository - 服务,其中包含获取会话/ EntityManager的方法,以及为此实体/功能区域执行JPA操作的方法。

所以,我会将查询移出Entity类,然后移入Repository(调用此方法的类,持有会话的类,听起来像是一个开始的地方。)