Отображение гибернации на самореферентную карту «многие ко многим»

#java #hibernate #jpa #orm

#java #переход в спящий режим #jpa #orm

Вопрос:

В моей базе данных у меня есть, Food которая имеет отношение «многие ко многим» с другим ингредиентом Foods . Эта взаимосвязь представлена как таковая…

  =============Foods============      ==========Ingredients=========== 
| Id | Name      | Description |    | FoodId | IngredientId | Amount |
 ==============================      ================================ 
| 1  | Ice Cream | ........... |    | 1      | 2            | 300    |
 ------------------------------      -------------------------------- 
| 2  | Milk      | ........... |
 ------------------------------ 
  

Однако в модели предметной области наиболее логичной структурой данных было бы отображение Foods и сумм. В конечном счете, когда я загружаю «Ice Cream», мне нужно, чтобы карта содержала все ингредиенты Foods (найденные в таблице ингредиентов) вместе с соответствующим значением, но у меня возникли проблемы с выяснением, как это сделать.

 @Entity
@Table(name="Foods")
public class Food {
  @Id 
  @GeneratedValue(strategy = GenerationType.IDENTITY) 
  @Column(name="Id")
  private int id;

  @Column(name="Name")
  private String name;

  @Column(name="Description")
  private String description;

  @ManyToMany ???
  private Map<Food, Integer> ingredients;
  

Комментарии:

1. Вы пробовали использовать @OneToMany ?

2. @jbx Я думаю, @ManyToMany в конечном итоге это будет базовая аннотация, но отображение кажется более сложным. Я предполагаю, что проблема, с которой я сталкиваюсь, больше связана с получением объекта » Еда » на карте на основе идентификатора из таблицы ингредиентов.

3. Ммм … честно говоря, я бы не стал подходить к этому таким образом. Проверьте мой грубый набросок ответа ниже, посмотрите, имеет ли это смысл.

Ответ №1:

Сначала я бы создал новую сущность Ingredient , которая имеет составной ключ, состоящий из обоих внешних ключей вместе с amount целым числом. Вы можете использовать Food непосредственно в качестве типов полей для обоих внешних ключей.

Затем в вашей Food сущности вы можете добавить @OneToMany Set<Ingredient> отображение id на Ingredient ‘s foodId . После этого вы сможете легко получить все Ingredient записи для одной Food .

Комментарии:

1. Сможет ли Hibernate неявно сопоставлять числовое значение FoodId с Food объектом?

2. Да, если только у вас не происходит что-то странное.