2011-01-06 43 views
4

我试图使用本地MySQL的MD5加密FUNC,所以我在映射文件中定义的自定义插件。休眠 - 本地SQL奇怪的命令参数

<hibernate-mapping package="tutorial"> 
    <class name="com.xorty.mailclient.client.domain.User" table="user"> 
    <id name="login" type="string" column="login"></id> 
    <property name="password"> 
     <column name="password" /> 
    </property> 
    <sql-insert>INSERT INTO user (login,password) VALUES (?, MD5(?))</sql-insert> 
    </class> 
</hibernate-mapping> 

然后,我创建的用户(只用2串很简单POJO - 登录名和密码),并尝试坚持它。

session.beginTransaction(); 
// we have no such user in here yet 
User junitUser = (User) session.load(User.class, "junit_user"); 
assert (null == junitUser); 
// insert new user 
junitUser = new User(); 
junitUser.setLogin("junit_user"); 
junitUser.setPassword("junitpass"); 
session.save(junitUser); 
session.getTransaction().commit(); 

究竟发生了什么?

用户被创建,但逆转参数顺序。他登录了“junitpass”,“junit_user”被MD5加密并存储为密码。

我是怎么了?由于

编辑:添加POJO类

package com.xorty.mailclient.client.domain; 

import java.io.Serializable; 

/** 
* POJO class representing user. 
* @author MisoV 
* @version 0.1 
*/ 
public class User implements Serializable { 

    /** 
    * Generated UID 
    */ 
    private static final long serialVersionUID = -969127095912324468L; 
    private String login; 
    private String password; 

    /** 
    * @return login 
    */ 
    public String getLogin() { 
     return login; 
    } 

    /** 
    * @return password 
    */ 
    public String getPassword() { 
     return password; 
    } 

    /** 
    * @param login the login to set 
    */ 
    public void setLogin(String login) { 
     this.login = login; 
    } 

    /** 
    * @param password the password to set 
    */ 
    public void setPassword(String password) { 
     this.password = password; 
    } 

    /** 
    * @see java.lang.Object#toString() 
    * @return login 
    */ 
    @Override 
    public String toString() { 
     return login; 
    } 

    /** 
    * Creates new User. 
    * @param login User's login. 
    * @param password User's password. 
    */ 
    public User(String login, String password) { 
     setLogin(login); 
     setPassword(password); 
    } 

    /** 
    * Default constructor 
    */ 
    public User() { 
    } 

    /** 
    * @return hashCode 
    * @see java.lang.Object#hashCode() 
    */ 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((null == login) ? 0 : login.hashCode()); 
     result = prime * result 
       + ((null == password) ? 0 : password.hashCode()); 
     return result; 
    } 

    /** 
    * @param obj Compared object 
    * @return True, if objects are same. Else false. 
    * @see java.lang.Object#equals(java.lang.Object) 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null) { 
      return false; 
     } 
     if (!(obj instanceof User)) { 
      return false; 
     } 
     User other = (User) obj; 
     if (login == null) { 
      if (other.login != null) { 
       return false; 
      } 
     } else if (!login.equals(other.login)) { 
      return false; 
     } 
     if (password == null) { 
      if (other.password != null) { 
       return false; 
      } 
     } else if (!password.equals(other.password)) { 
      return false; 
     } 
     return true; 
    } 


} 

回答

2

docs

参数顺序很重要,但由Hibernate处理性能的顺序确定。您可以通过启用org.hibernate.persister.entity级别的调试日志记录来查看预期的订单。启用此级别后,Hibernate将打印出用于创建,更新,删除实体的静态SQL。 (要看到预计的顺序。记得不要将定制SQL包含通过注释或映射文件因为他们会重载Hibernate生成的静态SQL)

听起来好像是没有办法预测的顺序。

+0

为什么会存在自定义插入这样的东西? – Xorty 2011-01-06 20:54:48