Hibernate-本机SQL参数的奇怪顺序

Xor*_*rty 4 java orm hibernate

我试图使用本机MySQL的MD5加密函数,因此我在映射文件中定义了自定义插入。

<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>
Run Code Online (Sandbox Code Playgroud)

然后,我创建用户(非常简单的POJO,仅包含2个字符串-登录名和密码)并尝试保留它。

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();
Run Code Online (Sandbox Code Playgroud)

实际发生了什么?

已创建用户,但参数顺序相反。他具有登录名“ 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;
    }


}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 5

文档

参数顺序很重要,并且由Hibernate处理属性的顺序定义。您可以通过启用该org.hibernate.persister.entity级别的调试日志记录来查看预期的顺序。启用此级别后,Hibernate将打印出用于创建,更新,删除等实体的静态SQL。(要查看预期的顺序,请记住不要通过注释或映射文件包括自定义SQL,因为这将覆盖Hibernate生成的静态sql)

听起来好像无法预测该顺序。

  • 那为什么还要存在自定义插入之类的东西呢? (3认同)
  • 这在2019年仍然是一件事情(Hibernate 5.4),我很难过 (3认同)
  • 嗯,它现在解决了这个问题。但我不知道该怎么想,它同时又好笑又悲伤。如果其他人有什么要说的,我会将这个话题开放几天看看。暂时谢谢。 (2认同)
  • 2020年还是这样。太悲伤了。 (2认同)