0

私は最初の webapp に取り組んでおり、休止状態を使用します。

私は持っている :

  • 休止状態 3.2.5
  • JSF2.1
  • Netbeans 7.2 Rc1

私がやろうとしているのは、ユーザーが自分の資格情報を入力するフォームを webapp に用意し、DB にあるものと照合することです。

そのための最初のステップは、JSF ==> 正常に動作しますが、情報を取得することです。次のステップは、DB に照会して、このユーザーがあり、パスワードが正しいことを確認することです。

この 2 番目のステップでは、問題があります。

これが私が呼んでいるコードです:

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$$

私が欲しいのは、Web ページから提供された名前を持つレコードの 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();

しかし、ここでは多くのことが改善される可能性があります。まず、これは、操作ごとのセッションと呼ばれるアンチパターンの典型的な例のように見えます。具体的には、データベースの要求ごとにセッションを開いたり閉じたりします。おそらく、この特定のユースケースの性質にすぎないことに注意してください...

次に、これは @NaturalId (または<natural-id/>) マッピングの有力候補です。4.1 以降、Hibernate は ID によるロードと同等のファースト クラス シチズンとして、自然 ID によるエンティティのロードを提供します。name を自然 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 に答える