2015-11-04 2 views
1

Имеют следующую структуру таблиц в схеме SQL: клиенты, сотрудники, заказы. И 3 класса объектов в Java-коде соответственно: Клиент, Сотрудник, Заказ.Hibernate. Несколько внешних ключей в одной таблице

Оба поля первичного идентификатора от клиентов и сотрудников находятся в таблице заказов в качестве внешних ключей.

Вопрос в том, как он должен отображаться в Java-коде? Как я понимаю, это должно быть сделано так, как добавление поля Set для клиентов и сотрудников, аннотированных с помощью @OneToMany.

Но что должно быть сделано в Order Entity, и, возможно, мне нужно добавить дополнительные аннотации, кроме @OneToMany?

ответ

1

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

Если на самом деле ваши заказы таблица имеют внешние ключи клиентов и сотрудников, то аннотации вы ищете @ManyToOne

@OneToMany аннотаций используются, когда объект имеет несколько записей, на которые ссылаются целевым объектом, в то время как @ManyToOne используется, когда ваш объект имеет только одну запись, ссылающуюся на целевую сущность.

Например:

Приказы лицо имеет одну ссылки от клиентов и одну ссылки от сотрудников организаций.

В этом случае Приказы лицо может быть нанесено на карту следующим образом:

@Entity 
@Table(name = "Orders") 
public class Order implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @ManyToOne 
    private Client client; 
    @ManyToOne 
    private Employee employee; 

    //getters and setters 
} 

@Entity 
@Table(name = "Clients") 
public class Client implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 

    //getters and setters 
} 

@Entity 
@Table(name = "Employees") 
public class Employee implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 

    //getters and setters 
} 

В примере, приведенном выше, вы должны быть в состоянии сделать вашу схему отлично работает с Hibernate, но ради понимания, давайте представим сценарий, в котором вам нужно будет получить все Заказы от Клиента, конечно, вы могли бы сделать это с запросом, который выбирал бы только Заказы внутри таблицы Client, однако Hibernate предлагает аннотацию @OneToMany, которая даст вам возможность получить доступ все Заказы от Клиента без необходимости отдельного запроса, только путем сопоставления! Давайте посмотрим пример:

@Entity 
@Table(name = "Orders") 
public class Order implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    @ManyToOne 
    private Client client; 

    //getters and setters 
} 

@Entity 
@Table(name = "Clients") 
public class Client implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String attribute1; 
    @OneToMany(mappedBy = "client") 
    private List<Order> orders; 

    //getters and setters 
} 

В этом примере вы должны быть в состоянии получить все заказы от клиента только по телефону ГЭТ атрибута «заказов». Обратите внимание, что при сопоставлении @OneToMany мы указали атрибут «mappedBy» как «клиент», это было необходимо, потому что у нас есть двунаправленное сопоставление между клиентом и порядком, при простом использовании @OneToMany вам не понадобится это сопоставление.

Важно: При работе с отображением @OneToMany вы в конечном итоге столкнуться с некоторыми ленивыми Fetching проблемы, в этом случае я настоятельно рекомендую вам взглянуть на этот вопрос:

Solve “failed to lazily initialize a collection of role” exception

Кроме того, я думаю, вы должны начать читать больше о Hibernate, чтобы понять, о его основные понятия, пожалуйста, проверьте этот другой вопрос о @OneToMany и @ManyToOne аннотациями на Hibernate:

Hibernate/JPA ManyToOne vs OneToMany

Смежные вопросы