java - 如何在Hibernate中定义非生成的主键字段

标签 java mysql sql hibernate primary-key

考虑 Person 类:

package model;
import java.io.Serializable;
import openAPI.modelInterfaces.PersonInterface;


/**
 * 
 * @author X3
 *
 */
public class Person implements PersonInterface , Serializable
{

    private static final long serialVersionUID = 1L;

    private String m_id = "Missing ID number";
    private String m_firstName = "Missing first name";;
    private String m_lastName = "Missing last name";;
    private String m_userName = "Missing user name";;
    private String m_password = "Missing password";
    private String m_address = "Missing address";
    private String m_status = "Missing status";

    /**
     * 
     * @param _id
     * @param _firstName
     * @param _lastName
     * @param _userName
     * @param _password
     * @param _address
     */
    public Person(String _id, String _firstName , String _lastName , 
            String _userName , String _password , String _address , String _status)
    {
        this.m_id = _id;
        this.m_firstName = _firstName;
        this.m_lastName = _lastName;
        this.m_userName = _userName;
        this.m_password = _password;
        this.m_address = _address;
        this.m_status = _status;
    }

    public Person() {}


    //////////////////////////  getters /////////////////////////


    @Override
    public String getLastName() {

        return this.m_lastName;
    }


    @Override
    public String getIdnumber() {
        return this.m_id;
    }



    @Override
    public String getFirstName() {
        return this.m_firstName;
    }



    @Override
    public String getUserName() {
        return this.m_userName;
    }




    @Override
    public String getPassword() {
        return this.m_password;
    }


    @Override
    public String getAddress() {
        return this.m_address;
    }


    ///////////////////// setters ///////////////////////

    @Override
    public void setAddress(String _address) {

        if (!isMissing(_address)) 
            this.m_address = _address;
    }

    @Override
    public void setLastName(String _lastName) {

        if (!isMissing(_lastName)) 
            this.m_lastName = _lastName;
    }

    @Override
    public void setPassword(String _password) 
    {
        if (!isMissing(_password)) 
            this.m_password = _password;
    }


    @Override
    public void setUsername(String _userName) {

            this.m_userName = _userName;
    }


    @Override
    public void setFirstName(String _newName) {

        if (!isMissing(_newName)) 
            this.m_firstName = _newName;
    }


    @Override
    public void setidNumber(String _newID) {

        if (!isMissing(_newID)) 
            this.m_id = _newID;
    }


    // others 

    private boolean isMissing(String value) 
    {
        return((value == null) || (value.trim().equals("")));
    }

    @Override
    public void setStatus(String _status) {
        if (!isMissing(_status)) 
            this.m_status = _status;

    }

    @Override
    public String getStatus() {
        return this.m_status;
    }
}

及其在MYSQL中的匹配表:

/**
 * creating a table for each type person in the bank 
 * @param tableType
 * @throws SQLException
 */
public void createTable(String tableType) throws SQLException
{
    m_statement.executeUpdate (

            "CREATE TABLE IF NOT EXISTS "+ tableType +" ("
            + "FirstName CHAR(20), LastName CHAR(20),"
            + "Address CHAR(50), IdNumber CHAR(20),"
            + "UserName CHAR(20), Password CHAR(20) , Status CHAR(20) , PRIMARY KEY (IdNumber))");
}

我想使用 Hibernate 将 Person 对象映射到 MYSQL DB 中的记录。

这是 hbm.xml 文件:

<?xml version='1.0'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- name of the package -->
<hibernate-mapping package="model">

<!-- name of the class & name of the table , that we want to MAP the object to  -->
<class name="Person" table="PersonnelTable">

<id name="m_id" type="String" column="IdNumber" >
<generator class="identity"/>
</id>

<property name="m_firstName" column="FirstName" type="string"/>
<property name="m_lastName" column="LastName" type="string"/>
<property name="m_userName" column="UserName" type="string"/>
<property name="m_passWord" column="Password" type="string"/>
<property name="m_address" column="Address" type="string"/>
<property name="m_status" column="PersonType" type="string"/>

</class>
</hibernate-mapping>

如何将主键 privateId 设置为非自动递增主键?

我不希望 MYSQL 自动为我映射的每个人生成唯一的 key ,因为 ID由用户给出。

谢谢

最佳答案

免费提供、易于搜索documentation说:

assigned

lets the application assign an identifier to the object before save() is called. This is the default strategy if no element is specified.

此外,您绝对不应该使用 char 作为列的类型,尤其是 ID。 char 列用空格填充。请改用 varchar。

而且:注释从 10 年前的 Java 5 就已经存在了。为什么您仍然使用专有的 XML 文件而不是标准的、更简单、更安全的 JPA 注释来定义映射?

关于java - 如何在Hibernate中定义非生成的主键字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23007711/

相关文章:

php - 更新和删除 mysql 表中的信息

mysql - 我应该如何优化这个mysql查询?

mysql - 连接查询返回重复行

mysql - Innodb缓冲池和多重连接

java - 用java编写C#委托(delegate)

java - emr如何在用户定义的函数中访问aws凭证

mysql - 从每个组中获取最新记录

mysql - 如何合并两个不同表中的数据?

java - Java代码性能改进建议

java - OpenJPA 查询执行缓慢