Java休眠多对一问题
我的Hibernate映射有问题。 我的实体之间有一个多对一映射。 我的Oracle DB中的两个表如下所示Java休眠多对一问题,java,hibernate,Java,Hibernate,我的Hibernate映射有问题。 我的实体之间有一个多对一映射。 我的Oracle DB中的两个表如下所示 Employee -------------------------- EMPLOYEE_
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
实例,然后将其设置为everyEmployee
,您将发现健康计划id在对象之间是一致的
健康计划ID值的差异可归因于测试代码的上述行为。此外,序列分配大小将增加50,这是默认值,并且您碰巧看到了六个连续序列增量操作的结果。请注意,Hibernate将更新不同事务中的序列,因此即使回滚当前事务,序列值也会增加
另一方面,我建议不要将单向@ManyToOne
关系与CascadeType
值一起使用。如果删除了一个Employee
实例,是否确实要删除所有Employee
实例的HealthPlan
,或者为此,允许为合并事件传播员工的HealthPlan
实例的更新
为每个创建的Employee
实例创建一个新的HealthPlan
实例。原始HealthPlan
实例不用于新Employee
和现有HealthPlan
之间的新映射。如果查询现有的HealthPlan
实例,然后将其设置为everyEmployee
,您将发现健康计划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