简体   繁体   English

如何在Hibernate中定义未生成的主键字段

[英]How to define a non generated primary key field in Hibernate

Consider class 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;
    }
}

And its matching table in MYSQL : 及其在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))");
}

I want to use Hibernate to map a Person object to a record in the MYSQL DB . 我想使用Hibernate将Person对象映射到MYSQL DB中的记录。

Here is the hbm.xml file : 这是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>

How can I set the primary key privateId to a non auto increment primary key ? 如何将主键privateId设置为非自动增量主键?

I don't want MYSQL to auto generate a unique key for each person that I map , since the ID is given by the user . 我不希望MYSQL为我映射的每个人自动生成一个唯一的密钥,因为ID是由用户提供的。

Thanks 谢谢

The freely available, easily searchable documentation says: 免费提供,易于搜索的文档说:

assigned 分配

lets the application assign an identifier to the object before save() is called. 让应用程序在调用save()之前为对象分配一个标识符。 This is the default strategy if no element is specified. 如果未指定任何元素,则这是默认策略。

Also, you should definitely not use char as the type of your columns, especially for IDs. 另外,绝对不要使用char作为列的类型,尤其是对于ID。 char columns are padded with spaces. char列用空格填充。 Use varchar instead. 请改用varchar。

And also: annotations exist since Java 5, 10 years ago. 并且:自10年前的Java 5开始就存在注释。 Why are you still using proprietary XML files instead of standard, much easier and safer JPA annotations to define your mappings? 为什么仍然使用专有XML文件而不是标准的,更简单和安全的JPA批注来定义映射?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM