2014-01-17 1 views
1

Я изучаю отображение в jpa и читаю около ManyToOne и OneToOne сопоставления. Сценарий:путаница в сопоставлении одного к одному в jpa

  • Многие сотрудники могут принадлежать отделу. то есть много времени между сотрудником и отделом
  • Один сотрудник связан с одним столом. то есть OneToOne между сотрудником и столом.

Я "в сопоставляется этих поля следующим образом

@ManyToOne 
@JoinColumn(name = "iddepartment") 
private Department department; 

@OneToOne 
@JoinColumn(name = "iddesk") 
private Desk desk; 

Согласно книге Mastering Java Persistence API, OneToOne отображения работает в качестве уникального внешнего ключа. Так что в моем примере, одна запись сотрудника должна иметь конкретную но даже если я создаю несколько сотрудников и назначу для них один и тот же столбец, он будет вставлен в базу данных. Так в чем же разница между ManyToOne и OneToOne здесь? По моему мнению, они ведут себя одинаково.

Я сохраняю сущности следующим образом:

/* Create EntityManagerFactory */ 
    EntityManagerFactory emf = Persistence 
      .createEntityManagerFactory("JPAExamples"); 

    /* Create EntityManager */ 
    EntityManager em = emf.createEntityManager(); 
    EntityTransaction transaction = em.getTransaction(); 
    transaction.begin(); 

    Employee employee; 

    employee = new Employee(); 
    employee.setFirstname("pranil"); 
    employee.setLastname("gilda"); 
    employee.setEmail("sdfsdf"); 

    Department department = em.find(Department.class, 1); // retrieves 
                  // department 
                  // from database 
    employee.setDepartment(department); 

    Desk desk = em.find(Desk.class, 1); // retrieves desk from database 
    employee.setDesk(desk); 

    em.persist(employee); 

    transaction.commit(); 

    employee = new Employee(); 
    employee.setFirstname("prasad"); 
    employee.setLastname("kharkar"); 
    employee.setEmail("dsfsdf"); 
    /* Now setting the same department for another employee which is fine because 
    * there is ManyToOne relationship betweem employee and department */ 
    employee.setDepartment(department); 

    /* 
    * Here is my doubt. Even if I set the same desk for another employee. THe insertion 
    * is fine. Shouldn't the OneToOne relationship between Employee and Desk restrict employee 
    * table having duplicate foreign key for both employees? 
    * 
    * If that is not true, then what is the difference between ManyToOne and OneToOne in this case? 
    * */ 
    employee.setDesk(desk); 

    transaction.begin(); 
    em.persist(employee); 
    transaction.commit(); 

ПРИМЕЧАНИЕ: Я не генерирую таблицы из объектов.

Так что мои вопросы:

  • JPA OneToOne аннотации не ставят уникальный внешний ключ на столе сотрудника. Это ожидаемый результат?
  • Если это так, то почему нет никакой разницы между отношениями ManyToOne и OneToOne?

EDIT: В соответствии с предоставленным ответом, я создал это как двунаправленную связь. Это дает тот же результат. Кроме того, я добавил unique = true. Это не делает никакой разницы

В бюро класса

@OneToOne(mappedBy = "desk") 
private Employee employee; 

и в классе Employee

@OneToOne 
@JoinColumn(name = "iddesk", unique = true) 
private Desk desk; 

Я пропускаю что-то серьезное?

+0

Пожалуйста, добавьте еще немного информации. Как OneToOne аннотируется в сущности Desk? Как вы их создаете и сохраняете? – kostja

+0

@kostja Я добавил некоторую информацию по вопросу sir. Отображение OneToOne здесь однонаправлено. SO не нужно было комментировать объект OneToOne in Desk –

ответ

0

У вас есть однонаправленное отображение @OneToOne. Если у вас было двунаправленное сопоставление @OneToOne с атрибутом mappedBy, установленным на стороне «владеющего», поведение будет таким, как ожидалось.

E.g. в объекте Сотрудника

@OneToOne(mappedBy="employee") 
Desk desk 

И в объекте Desk

@OneToOne 
Employee employee 
+0

Если я добавлю уникальное ограничение ключа в базу данных, он будет работать так, как ожидалось. Нужно ли мне создавать двунаправленные отношения?почему не существует однонаправленных отношений без двунаправленных отношений? –

+0

Я добавил, как вы предложили. Это он не дает желаемого результата. –

+0

Мое предположение исходило из моего собственного рабочего кода и может ввести в заблуждение. В моем коде у меня также есть ограничения внешнего ключа в базе данных, но поскольку они были созданы автоматически из Java-модели, я не уделял слишком много внимания –