【问题标题】:Hibernate inserting null values in table with One To Many mapping and Oracle SequenceHibernate 使用一对多映射和 Oracle 序列在表中插入空值
【发布时间】:2015-08-24 18:02:50
【问题描述】:

我有两个表 Employee 和 Department,我试图通过 OneToMany 映射保留 Department 数据。当我保存数据时,将插入到部门表和员工表中,但员工表中的 deptid 更新为空值。有人可以帮我解决这个问题吗?

下面是我的类、映射文件和配置文件。

public class Department {
    private int deptid;
    private String deptname;
    private Set<Employee> empSet;
    public int getDeptid() {
        return deptid;
    }
    public void setDeptid(int deptid) {
        this.deptid = deptid;
    }
    public String getDeptname() {
        return deptname;
    }
    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }
    public Set<Employee> getEmpSet() {
        return empSet;
    }
    public void setEmpSet(Set<Employee> empSet) {
        this.empSet = empSet;
    }
}

public class Employee {

    private String empname;
    private int empid;
    private int salary;
    private int age;
    private int deptid;
    private String gender;
    public int getDeptid() {
        return deptid;
    }
    public void setDeptid(int deptid) {
        this.deptid = deptid;
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
    public int getEmpid() {
        return empid;
    }
    public void setEmpid(int empid) {
        this.empid = empid;
    }

}


public class RunDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Configuration conf = new Configuration();
        conf.configure("com/hibernate/OneToMany/hibernate.cfg.xml");
        SessionFactory factory = conf.buildSessionFactory();
        Session session = factory.openSession();
        Transaction transaction = session.beginTransaction();

        Employee emp1 = new  Employee();
        emp1.setEmpname("Sowmya");
        emp1.setAge(26);
        emp1.setGender("F");
        emp1.setSalary(77600);

        Employee emp2 = new  Employee();
        emp2.setEmpname("Raju");
        emp2.setAge(29);
        emp2.setGender("M");
        emp2.setSalary(67600);

        Employee emp3 = new  Employee();
        emp3.setEmpname("Shyam");
        emp3.setAge(30);
        emp3.setGender("M");
        emp3.setSalary(37600);

        Set<Employee> employeeSet = new HashSet<Employee>();
        employeeSet.add(emp1);
        employeeSet.add(emp3);
        employeeSet.add(emp2);

        Department department = new Department();
        department.setDeptid(55);
        department.setDeptname("TestDept");
        department.setEmpSet(employeeSet);

        session.save(department);

        transaction.commit();
        session.close();


    }

}

部门映射文件:

 <hibernate-mapping>
     <class name="com.hibernate.OneToMany.Department" table="DEPARTMENT" schema="TEST"> 
        <id name="deptid" type="int">
            <column name="deptid" precision="5" scale="0" />
            <generator class="assigned" />
        </id>
        <set name="empSet" table="EMPLOYEE" cascade="all">
            <key column="deptid"></key>
            <one-to-many class="com.hibernate.OneToMany.Employee"/>
        </set>
        <property name="deptname" length="50" type="string" column="deptname"></property>
     </class>
 </hibernate-mapping>

员工映射文件:

 <hibernate-mapping>
     <class name="com.hibernate.OneToMany.Employee" table="EMPLOYEE" schema="TEST"> 
        <id name="empid" type="int">
            <column name="empid" precision="5" scale="0" />
            <generator class="sequence">
                <param name="sequence">EMPID_SEQ</param>
            </generator>
        </id>
        <property name="empname" length="50" type="string" column="empname"></property>
        <property name="salary" type="int" column="salary"></property>
        <property name="age" type="int" column="age"></property>
        <property name="gender" length="2" type="string" column="gender"></property>
     </class>
 </hibernate-mapping>


CREATE TABLE "TEST"."EMPLOYEE" 
   (    "EMPID" NUMBER NOT NULL ENABLE, 
    "EMPNAME" VARCHAR2(20 BYTE), 
    "DEPTID" NUMBER, 
    "SALARY" NUMBER, 
    "AGE" NUMBER, 
    "GENDER" VARCHAR2(20 BYTE), 
    "VER" NUMBER, 
    "EMPLOYMENT_TYPE" VARCHAR2(50 BYTE), 
    "CODE" VARCHAR2(1 BYTE), 
     CONSTRAINT "EMPLOYEE_PK" PRIMARY KEY ("EMPID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "EMPLOYEE_FK1" FOREIGN KEY ("DEPTID")
      REFERENCES "TEST"."DEPARTMENT" ("DEPTID") ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;




  CREATE TABLE "TEST"."DEPARTMENT" 
   (    "DEPTID" NUMBER NOT NULL ENABLE, 
    "DEPTNAME" VARCHAR2(50 BYTE), 
     CONSTRAINT "DEPARTMENT_PK" PRIMARY KEY ("DEPTID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    我相信您的员工 hbm.xml 文件需要这个:

    <many-to-one name="deptid" class="com.hibernate.OneToMany.Department" fetch="select">
         <column name="DEPTID" not-null="true" />
    </many-to-one>
    

    否则,休眠没有迹象表明deptid 存在于Employee 对象中。

    【讨论】:

    • 添加上述代码时出现以下错误。休眠:从线程“主”org.hibernate.PropertyAccessException 中的双重异常中选择 EMPID_SEQ.nextval:调用 com.hibernate.OneToMany.Department.deptid 的 getter 时发生 IllegalArgumentException
    • 所以看起来您的列名实际上是“DEPTID”,而不是我上面给出的“DEPT_ID”。请尝试一下。
    • 如果这不起作用,请在保存之前提供您用于创建部门/员工的代码。
    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2010-09-28
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    相关资源
    最近更新 更多