0

我正在开发我的第一个 web 应用程序,我将使用 hibernate。

我有 :

  • 休眠 3.2.5
  • JSF 2.1
  • Netbeans 7.2 Rc1

我想要做的是,在我的 web 应用程序中有一个表单,用户将在其中输入他们的凭据,然后我会将它们与我在数据库中的内容进行匹配。

第一步是获取信息,尽管 JSF ==> 工作正常。下一步是查询数据库以检查我有这个用户并且密码是否正确。

对于第二步,我有一个问题。

这是我正在调用的代码:

public String checkUser() {
    /** 1° Query the database for active users with specified name. */
    session = helper.getSessionFactory().openSession();
    PAC_USERS queryUsr = new PAC_USERS();
    session.load(PAC_USERS.class, queryUsr);
    session.beginTransaction();
    queryUsr.setName(this.name);
    this.user = (PAC_USERS) session.get(PAC_USERS.class, queryUsr);
    session.close();
    return null;
    /** 2° verify password against the one stored in the DB. */
}

这是休眠映射文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class catalog="pac" name="com.a3c.pac.jsf.beans.PAC_USERS" table="pac_users">
       <id column="id" name="id" type="integer">
           <generator class="identity"/>
       </id>
       <property column="name" name="name" type="string"/>
       <property column="password" name="password" type="string"/>
   </class>
</hibernate-mapping>

这是我的表的 SQL 语句:

CREATE TABLE `pac_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `active` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1$$

我想要的是在 PAC_USERS 表中查询具有通过网页提供的名称的记录。

PAC_USERS.java 类也可能有帮助,这里是:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.a3c.pac.jsf.beans;

import java.io.Serializable;

/**
 *
 * @author Utilisateurs
 */
public class PAC_USERS implements Serializable {
    private Integer id;
    private String name;
    private String password;
    private Boolean active = false;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }
}

任何建议将不胜感激。

提前致谢。

保重,马可。

4

1 回答 1

2

完全不了解 session.load 和 session.get 的目的。如果您想按名称加载 PAC_USERS 对象(我什至不会进入该命名),那么您只需这样做(假设名称是唯一的):

session = helper.getSessionFactory().openSession();
this.user = (PAC_USERS) session.createQuery( "select u from PAC_USERS u where u.name = :username" )
        .setParameter( "username", this.name )
        .uniqueResult();
session.close();

但是,这里有很多事情可以做得更好。首先,这似乎是我们称之为 session-per-operation 的反模式的一个主要示例,特别是为数据库的每个请求打开和关闭一个 Session。也许这只是这个特定用例的性质,请注意......

接下来,这是@NaturalId(或<natural-id/>)映射的良好候选者。从 4.1 开始,Hibernate 提供按 natural-id 加载实体作为与按 id 加载相同的一等公民。假设您已将名称映射为自然 id,您可以这样做:

session = helper.getSessionFactory().openSession();
this.user = (PAC_USERS) session.bySimpleNaturalId( PAC_USERS.class ).load( this.name );
session.close();

最后,如果您对这个返回的用户所做的只是验证他们的身份验证凭据,那么您最好不要返回该实体。或者,直接选择密码并验证:

session = helper.getSessionFactory().openSession();
final String password = (String) session.createQuery( "select u.password from PAC_USERS where u.name = :username" )
        .setParameter( "username", this.name )
        .uniqueResult();
session.close();

或者只是在查询中执行验证:

session = helper.getSessionFactory().openSession();
final Long matches = (Long) session.createQuery( "select count(*) from PAC_USERS where u.name = :username and u.password = :pswd" )
        .setParameter( "username", this.name )
        .setParameter( "pswd", this.password )
        .uniqueResult();
// count should == 1...
session.close();
于 2012-07-22T01:57:46.747 回答