Java Hibernate много к одному вопросу - PullRequest
1 голос
/ 18 августа 2011

У меня проблема с отображением Hibernate.У меня есть соотношение один к другому между моей сущностью.Две таблицы в моей базе данных Oracle следующие ...

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

В Таблице Health_Plan HEALTH_PLAN_ID = 3 (что правильно !!!) В Таблице сотрудников HEALTH_PLAN_ID = 1850 (Откуда пришло это значение ??? Я ожидаю, что оно также будет 3).

Я пытался несколько раз, и я заметил, что в Таблице сотрудников HEALTH_PLAN_ID просто увеличивается на 300. Я думаю, что я уже установил опцию каскада.

Любые подсказки?

Ответы [ 2 ]

1 голос
/ 18 августа 2011
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");

создает новый экземпляр HealthPlan для каждого созданного экземпляра Employee. Исходный экземпляр HealthPlan не используется в новом отображении между новым Employee и существующим HealthPlan. Если вы запросите существующий экземпляр HealthPlan, а затем установите его для каждого Employee, вы обнаружите, что идентификатор плана работоспособности будет одинаковым для всех объектов.

Расхождение в значениях для значений HEALTH_PLAN_ID может быть связано с вышеупомянутым поведением вашего тестового кода. Кроме того, размер выделения последовательности был бы увеличен на 50, что является значением по умолчанию, и вы видите результат шести последовательных операций увеличения последовательности. Обратите внимание, что Hibernate обновит последовательности в другой транзакции, поэтому вы обнаружите, что значения последовательностей будут увеличиваться, даже если вы откроете текущую транзакцию.

С другой стороны, я бы не советовал использовать однонаправленное отношение @ManyToOne со значением CascadeType ALL. Вы действительно хотите удалить HealthPlan всех Employee экземпляров, если удаляется один Employee, или, если на то пошло, разрешить распространение обновлений HealthPlan от Employee для событий слияния?

0 голосов
/ 18 августа 2011

Я не знаю точную причину проблемы, но сразу вижу некоторые проблемы с кодом. 1. В таблице плана медицинского обслуживания аннотация говорит GenerationType.SEQUENCE, где, как в таблице сотрудников, она говорит GenerationType.AUTO. 2.В таблице сотрудников @Column (имя = " employee_id ", nullable = false). employee_id не является ни именем переменной в классе сущности, ни именем фактического столбца. Три столбца в этом классе сущностей имеют эту проблему.

Возможно, если вы это исправите, это может решить вашу проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...