Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java休眠多对一问题_Java_Hibernate - Fatal编程技术网

Java休眠多对一问题

Java休眠多对一问题,java,hibernate,Java,Hibernate,我的Hibernate映射有问题。 我的实体之间有一个多对一映射。 我的Oracle DB中的两个表如下所示 Employee -------------------------- EMPLOYEE_

我的Hibernate映射有问题。 我的实体之间有一个多对一映射。 我的Oracle DB中的两个表如下所示

Employee                                                                                                                                                      
--------------------------
EMPLOYEE_ID  
EMPLOYEE_FIRST_NAME   
EMPLOYEE_LAST_NAME   
HEALTH_PLAN_ID                                                                                                                                                   
Health_Plan
------------------=
HEALTH_PLAN_ID
HEALTH_PLAN_NAME
HEALTH_PLAN_RATE
我的地图

@Entity
@Table(name = "Employee")
@SequenceGenerator(name = "employee_seq", sequenceName = "employee_seq")
public class Employee {
    private int employeeId;
    private String firstName;
    private String lastName;
    private HealthPlan plan;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "employee_seq")
    @Column(name = "employee_id", nullable = false)
    public int getEmployeeId() {
        return employeeId;
    }
    @Column(name = "employee_first_name", nullable = false)
    public String getFirstName() {
        return firstName;
    }
    @Column(name = "employee_last_name", nullable = false)
    public String getLastName() {
        return lastName;
    }
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "HEALTH_PLAN_ID")
    public HealthPlan getPlan() {
        return plan;
    }
}

@Entity
@Table(name = "HEALTH_PLAN")
@SequenceGenerator(name = "HEALTH_PLAN_SEQ", sequenceName = "HEALTH_PLAN_SEQ")
public class HealthPlan {
    private int healthPlanId;
    private String healthPlanName;
    private double healthPlanRate;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "HEALTH_PLAN_SEQ")
    @Column(nullable = false, name = "HEALTH_PLAN_ID")
    public int getHealthPlanId() {
        return healthPlanId;
    }
    @Column(nullable = false, name = "HEALTH_PLAN_NAME", unique = true)
    public String getHealthPlanName() {
        return healthPlanName;
    }
    @Column(nullable = false, name = "HEALTH_PLAN_RATE")
    public double getHealthPlanRate() {
        return healthPlanRate;
    }
}
当我运行下面的代码时

    public static void main(String[] args) throws SQLException {        
        HealthPlanDaoImpl healthDao = new HealthPlanDaoImpl();
        EmployeeDaoImpl empDao = new EmployeeDaoImpl();

        HealthPlan plan = new HealthPlan();
        plan.setHealthPlanName("PLAN B");
        plan.setHealthPlanRate(5.0);

        Employee emp = new Employee();
        emp.setPlan(plan);
        emp.setFirstName("Jane");
        emp.setLastName("Doe");
        boolean isSuccess = empDao.addEmployee(emp);
        System.out.println(isSuccess);

    }
public class EmployeeDaoImpl{
    public  boolean addEmployee(Employee emp) {
      boolean bolReturn = true;

      Session session = HibernateUtil.beginTransaction();
      try {
          session.save(emp);
          HibernateUtil.commitTransaction();
      } catch (Exception e) {
          e.printStackTrace();
          bolReturn = false;
          HibernateUtil.rollbackTransaction();
      } 
      return bolReturn;
    }
}
在健康计划表中,健康计划ID=3(正确!!!) 在Employee表中,HEALTH_PLAN_ID=1850(该值来自何处?我希望也是3)

我试了几次,发现在Employee表HEALTH\u PLAN\u ID中只增加了300。 我想我已经设置了级联选项


有什么提示吗?

我不知道问题的确切原因,但我可以立即看到代码中的一些问题。 1.在健康计划表中,注释显示GenerationType.SEQUENCE,而在employee表中,注释显示GenerationType.AUTO 2.在employee表@Column(name=“employee\u id”中,nullable=false)。employee_id既不是实体类中变量的名称,也不是实际列的名称。该实体类中的三列存在此问题


如果您解决了这个问题,它可能会解决您的问题?

我不知道问题的确切原因,但我可以立即看到代码中的一些问题。
HealthPlan plan = new HealthPlan();
plan.setHealthPlanName("PLAN B");
plan.setHealthPlanRate(5.0);

Employee emp = new Employee();
emp.setPlan(plan);
emp.setFirstName("Jane");
emp.setLastName("Doe");
1.在健康计划表中,注释显示GenerationType.SEQUENCE,而在employee表中,注释显示GenerationType.AUTO 2.在employee表@Column(name=“employee\u id”中,nullable=false)。employee_id既不是实体类中变量的名称,也不是实际列的名称。该实体类中的三列存在此问题

如果你解决了这个问题,它可能会解决你的问题

HealthPlan plan = new HealthPlan();
plan.setHealthPlanName("PLAN B");
plan.setHealthPlanRate(5.0);

Employee emp = new Employee();
emp.setPlan(plan);
emp.setFirstName("Jane");
emp.setLastName("Doe");
为每个创建的
Employee
实例创建一个新的
HealthPlan
实例。原始
HealthPlan
实例不用于新
Employee
和现有
HealthPlan
之间的新映射。如果查询现有的
HealthPlan
实例,然后将其设置为every
Employee
,您将发现健康计划id在对象之间是一致的

健康计划ID值的差异可归因于测试代码的上述行为。此外,序列分配大小将增加50,这是默认值,并且您碰巧看到了六个连续序列增量操作的结果。请注意,Hibernate将更新不同事务中的序列,因此即使回滚当前事务,序列值也会增加

另一方面,我建议不要将单向
@ManyToOne
关系与
CascadeType
值一起使用。如果删除了一个
Employee
实例,是否确实要删除所有
Employee
实例的
HealthPlan
,或者为此,允许为合并事件传播员工的
HealthPlan
实例的更新

为每个创建的
Employee
实例创建一个新的
HealthPlan
实例。原始
HealthPlan
实例不用于新
Employee
和现有
HealthPlan
之间的新映射。如果查询现有的
HealthPlan
实例,然后将其设置为every
Employee
,您将发现健康计划id在对象之间是一致的

健康计划ID值的差异可归因于测试代码的上述行为。此外,序列分配大小将增加50,这是默认值,并且您碰巧看到了六个连续序列增量操作的结果。请注意,Hibernate将更新不同事务中的序列,因此即使回滚当前事务,序列值也会增加


另一方面,我建议不要将单向
@ManyToOne
关系与
CascadeType
值一起使用。如果删除了一个
Employee
实例,是否确实要删除所有
Employee
实例中的
HealthPlan
,或者为此,允许为合并事件传播员工的
HealthPlan
实例更新?

注释
@列中的名称表示表列名,而不是实体属性名(无意义)。此外,Oracle列名默认不区分大小写,除非它们被引用,因此
@column(name=“employee\u id”…
实际上映射到
employee.employee\u id
@column
注释中的名称表示表列名,而不是实体属性名(这是无意义的)。此外,Oracle列名默认不区分大小写,除非它们被引用,因此
@column(name=“employee\u id”…
实际上映射到
Employee.Employee\u ID
。我想我了解了您关于HealthPlan的第一点。我认为当我保存我的Employee实例时,HealthPlan应该存在。关于第二点,理想的CascadeType选项应该是什么?Thanks@Mark,我建议使用双向
@ManyToOne
(通过指定
@OneToMany
集合
列表
健康计划
中的
员工
实例)而不是单向的
@OneToMany
;然后在
HealthPlan
中的反向
@OneToMany
声明中指定级联类型。然后,您可以在
@OneToMany
注释中指定所有级联类型,而不是
@OneToMany
注释。这是Hibern的一个概念我很难理解的地方。我真的需要配置实体两端的关联吗?我的意思是,当我执行查询时,使用带有p