Hibernate/Java:检索主键总是返回零

Hibernate/Java:检索主键总是返回零,java,mysql,spring,hibernate,maven,Java,Mysql,Spring,Hibernate,Maven,我正在尝试将Hibernate与MySQL结合使用。以下是有关我的软件的更多信息: IDE:InteliJ理念 春季MVC TomCat服务器 专家 冬眠 我有一个家族实体和一个用户实体。每个用户都将是“家庭单元”的一部分,因此我需要能够检索每个用户的家庭id,以显示各种类型的家庭树。但是,无论我做什么,我都无法让familyId返回除0或null之外的任何内容。以下是我目前掌握的代码: 家庭控制器 @RequestMapping (value = "/dashboard/admin/new",

我正在尝试将Hibernate与MySQL结合使用。以下是有关我的软件的更多信息:

IDE:InteliJ理念 春季MVC TomCat服务器 专家 冬眠

我有一个家族实体和一个用户实体。每个用户都将是“家庭单元”的一部分,因此我需要能够检索每个用户的家庭id,以显示各种类型的家庭树。但是,无论我做什么,我都无法让familyId返回除0或null之外的任何内容。以下是我目前掌握的代码:

家庭控制器

@RequestMapping (value = "/dashboard/admin/new", method = RequestMethod.POST)
public String newAdmin(@RequestParam("famName") String famName,
                       @RequestParam("fName") String fName,
                       @RequestParam("lName") String lName,
                       @RequestParam("email") String email,
                       @RequestParam("password") String password,
                       Model model){

    FamiliesEntity family = newFamily(famName);
    UsersEntity user = newAdmin(fName,lName,email,password,family.getFamilyid());

    model.addAttribute("family", family);
    model.addAttribute("user", user);

    return "adminDashboard";
}

@RequestMapping ("/register/user")
public String registerUser(){
    return "newUser";
}

private FamiliesEntity newFamily(String famName) {
    Configuration configurationObject = new Configuration().configure("hibernate.cfg.xml");
    SessionFactory sessionFactory = configurationObject.buildSessionFactory();
    Session adminSession = sessionFactory.openSession();
    Transaction familyTransaction = adminSession.beginTransaction();
    FamiliesEntity newFamily = new FamiliesEntity();

    newFamily.setName(famName);

    // returns 0, should return 0
    System.out.println("before save :" + newFamily.getFamilyid());

    int testvalue = (Integer)adminSession.save(newFamily);

    // both return 0, should return 30-something
    System.out.println("after save :" + newFamily.getFamilyid());
    System.out.println("after save :" + testvalue);

    familyTransaction.commit();

    // both return 0, should return 30-something
    System.out.println("after commit :" + newFamily.getFamilyid());
    System.out.println("after commit :" + testvalue);

    return newFamily;
}
家庭实体

package com.grandcircus.spring.models;

import javax.persistence.*;

/**
 * Class description
 *
 * @author Sarah Guarino
 * @version 1.0
 */
@Entity
@Table(name = "families", schema = "checkin", catalog = "")
public class FamiliesEntity {
    @Id
    @GeneratedValue
    private int familyid;
    private String name;

    @Column(name = "familyid", nullable = false)
    public int getFamilyid() {
        return familyid;
    }

    public void setFamilyid(int familyid) {
        this.familyid = familyid;
    }

    @Basic
    @Column(name = "name", nullable = false, length = 45)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        FamiliesEntity that = (FamiliesEntity) o;

        if (familyid != that.familyid) return false;
        if (name != null ? !name.equals(that.name) : that.name != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = familyid;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}
FamilyEntity.hbm.xml

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

    <class name="com.grandcircus.spring.models.FamiliesEntity" table="families" schema="checkin">
        <id name="familyid">
            <column name="familyid" sql-type="int(10) unsigned zerofill"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(45)" length="45"/>
        </property>
    </class>
</hibernate-mapping>

Hibernate可以通过字段和getter方法注释访问数据

Hibernate将根据@Id注释的位置选择访问方法,您不能将它们混合使用。如果用@Id注释字段,则方法上的注释将被忽略,反之亦然

因此,您应该在字段上方或getter方法上方设置注释

移动

获得

 @Id
 @GeneratedValue
 @Column(name = "familyid", nullable = false)
    public int getFamilyid() {
        return familyid;
    }
实际上,您不需要FamilyEntity.hbm.xml

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

    <class name="com.grandcircus.spring.models.FamiliesEntity" table="families" schema="checkin">
        <id name="familyid">
            <column name="familyid" sql-type="int(10) unsigned zerofill"/>
        </id>
        <property name="name">
            <column name="name" sql-type="varchar(45)" length="45"/>
        </property>
    </class>
</hibernate-mapping>
使用


我希望这会有所帮助)

问题是Hibernate错误地生成了my FamilyEntity.hbm.xml。如有:

    <id name="familyid">
        <column name="familyid" sql-type="int(10) unsigned zerofill"/>
    </id>

它应该有:

    <id name="familyid" type="int" column="familyid">
        <generator class="native" />
    </id>


在第二个示例中,使用int而不是int(10)。column应该是列名,与您在第一个示例中的“name=''”中看到的值相同

它没有解决问题,但它仍然是很好的信息。非常感谢。我希望我能投你一票,但我还不能。标签救了我!
    <id name="familyid" type="int" column="familyid">
        <generator class="native" />
    </id>