Я изучаю отображение в 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;
Я пропускаю что-то серьезное?
Пожалуйста, добавьте еще немного информации. Как OneToOne аннотируется в сущности Desk? Как вы их создаете и сохраняете? – kostja
@kostja Я добавил некоторую информацию по вопросу sir. Отображение OneToOne здесь однонаправлено. SO не нужно было комментировать объект OneToOne in Desk –