请考虑以下(部分)课程:
@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项目)时是否是一种好的做法,以及它可以带来什么样的问题(如果有的话)。
答案 0 :(得分:1)
如果你为你的模型账户创建一个DAO类说AccountDAO并将查找方法移到AccountDAO会更好。
答案 1 :(得分:1)
在我的书中传递session
(或EntityManager
或几乎任何其他服务对象)并不是一种好习惯。这样就足够了,你会发现自己在收集和控制数据库调用的地方时遇到了麻烦。 Service
- 对象应该是"使用"数据对象,而不是相反。
正确的做法是创建一个Repository
- 服务,其中包含获取会话/ EntityManager的方法,以及为此实体/功能区域执行JPA操作的方法。
所以,我会将查询移出Entity类,然后移入Repository(调用此方法的类,持有会话的类,听起来像是一个开始的地方。)