主键的单独实体

时间:2011-09-25 11:02:46

标签: java hibernate

我有两张表格如下。enter image description here

“User Acc”是用户的个人资料详细信息,用户的登录详细信息(用户名密码)位于名为login的单独表格中。当我在Netbeans IDE中生成实体时,有2个表用于登录(数据库)表。一个生成的实体是“Login”,另一个是“LoginId”.Login实体具有对LoginId和UserAcc实体的引用。 LoginId实体具有登录数据库表中的用户名和密码.UserAcc的主键为每个用户的INT。该键是登录表的外键。

现在我想检查用户@loging。我是怎么做的,我创建一个LoginId实例并设置用户名和密码,然后检查具有相同LoginId的任何对象。这是代码 uName和pw是字符串,取自用户输入。

  LoginId id=new LoginId(uName, pw);

 Session ses = NewHibernateUtil.getSessionFactory().openSession();            
 Criteria crit = ses.createCriteria(Login.class);
 crit.add(Restrictions.eq("id", id));
 Entities.Login log = (Entities.Login)crit.uniqueResult();

但是,虽然现有的用户名和密码与给定的用户名和密码相匹配,但log始终为空。

任何人告诉我应该在哪里检查以及问题是什么。谢谢。 另一个问题是为什么在一个数据库表中为两列(主键)创建一个单独的实体(“LoginId”),为其数据库表创建另一个实体。

登录;

<hibernate-mapping>
<class name="Entities.Login" table="login" catalog="pcw">
    <composite-id name="id" class="Entities.LoginId">
        <key-property name="uname" type="string">
            <column name="uname" length="10" />
        </key-property>
        <key-property name="pw" type="string">
            <column name="pw" length="10" />
        </key-property>
    </composite-id>
    <many-to-one name="useracc" class="Entities.Useracc" fetch="select">
        <column name="UserAcc_uid" not-null="true" />
    </many-to-one>
</class>

UserAcc:

<hibernate-mapping>
<class name="Entities.Useracc" table="useracc" catalog="pcw">
    <id name="uid" type="java.lang.Integer">
        <column name="uid" />
        <generator class="identity" />
    </id>
    <property name="fname" type="string">
        <column name="fname" length="45" />
    </property>
    <property name="sname" type="string">
        <column name="sname" length="45" />
    </property>
    <property name="RDate" type="date">
        <column name="r_date" length="10" />
    </property>
    <property name="street" type="string">
        <column name="street" length="45" />
    </property>
    <property name="city" type="string">
        <column name="city" length="45" />
    </property>
    <property name="email" type="string">
        <column name="email" length="45" />
    </property>
    <property name="tel" type="string">
        <column name="tel" length="45" />
    </property>
    <set name="comments" inverse="true" cascade="all">
        <key>
            <column name="UserAcc_uid" not-null="true" />
        </key>
        <one-to-many class="Entities.Comment" />
    </set>
    <set name="logins" inverse="true" cascade="all">
        <key>
            <column name="UserAcc_uid" not-null="true" />
        </key>
        <one-to-many class="Entities.Login" />
    </set>
</class>

1 个答案:

答案 0 :(得分:3)

无论如何,你可以使用HQL来解决它,它看起来会越来越像这样:

public boolean authenticate(Sting username,String pass){
Session ses = NewHibernateUtil.getSessionFactory().openSession();            
String sql = "from Login login where login.username:= username and login.pass = :=pass";
Query query = session.createQuery(sql);
query.setString("username",username);
query.setString("pass",pass);
List<Login> result = query.list();
 //close session, transaction,etc....
if (result ==null)
  return false;
else
  return true;
}