【发布时间】:2013-04-10 10:11:26
【问题描述】:
无论我是否更改实体类,我的 DAO (findByUsername) 中的函数始终返回 0 行,即使从实体中删除注释后也没有例外,只有 0 行。根据我找到的一些示例,此代码在基于 spring 的应用程序中实现。
DAO:
@Repository("userDao")
public class UserDao extends CustomHibernateDaoSupport {
public void save(User user) {
getHibernateTemplate().save(user);
}
public void delete(User user) {
getHibernateTemplate().delete(user);
}
public User findByUsername(String username) throws DataNotFoundException {
Session session = getSession();
Criteria crit = session.createCriteria(User.class);
System.out.println(username);
crit.add(Restrictions.eq("username", username));
crit.setMaxResults(1);
List<User> users = crit.list();
System.out.println(users);
if (users.size() < 1) {
throw new DataNotFoundException();
}
return users.get(0);
}
}
实体:
@Entity
@Table(name = "users")
public class User {
private Integer id;
private String username;
private String password;
private boolean active;
private String activationCode;
private Date createdAt;
private String email;
private Set<Wall> walls = new HashSet<Wall>();
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "username", unique = true, nullable = false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(name = "password")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Column(name = "active")
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
@Column(name = "activation_code")
public String getActivationCode() {
return activationCode;
}
public void setActivationCode(String activationCode) {
this.activationCode = activationCode;
}
@Column(name = "created_at", columnDefinition = "DATETIME")
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
@Column(name = "email")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "users_has_walls", joinColumns = {
@JoinColumn(name = "user_id", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "wall_id",
nullable = false, updatable = false) })
public Set<Wall> getWalls() {
return walls;
}
public void setWalls(Set<Wall> walls) {
this.walls = walls;
}
}
【问题讨论】:
-
显而易见的问题:您的数据库中有数据吗?您也可以使用
crit.uniqueResult()返回单个元素,而不是crit.list().get(0); -
Hibernate 生成的 SQL 是什么?有时生成的 SQL 与您对它应该做什么的期望不符。使用独立工具自行运行该 SQL 以帮助调试问题。
-
将 SQL 日志记录设置“hibernate.show_sql”设置为“true”并检查生成的查询。尝试手动对您的数据库运行查询
-
从 HQL 获取给了我:用户未映射 [FROM User]。我在用户表中有一行。
-
似乎 hibernate 没有映射我的类,将其更改为扫描整个包,并在运行时将实体打开为异常。 IE。未知的 mappedBy 在:com.walladverts.model.entities.Post.user,引用的属性未知:com.walladverts.model.entities.User.user