JPA-аннотация для добавления и просмотра значений из справочной таблицы - PullRequest
2 голосов
/ 28 ноября 2011

Скажите, у меня есть этот класс:

@Entity
@Table(name="PICTURE")
public class Picture{
   private String category1, category2;
}

но структура базы данных выглядит следующим образом:

TABLE PICTURE {
   int category1;
   int category2;
   ...
}

TABLE PICTURE_REF {
   int category;
   String categoryName;
   ...
}

Как бы я использовал аннотации JPA на Picture, чтобы каждый раз, когда я запрашивал его экземпляр, category1 и category2 содержали categoryName из таблицы PICTURE_REF вместо фактического целочисленного идентификатора, хранящегося в PICTURE таблица

Мне также интересно, как будет работать сохранение, потому что пользователь выберет категорию из выпадающего списка, и соответствующий целочисленный идентификатор категории будет тем, что хранится в таблице PICTURE.

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Если вы не можете изменить схему

Вы можете изменить свое отображение так, чтобы Категория была сущностью, а не просто Строкой. Тогда у вас будет OneToOne или (что более вероятно) ManyToOne из рисунка в категорию для категории 1 и категории 2.

Если вы МОЖЕТЕ изменить схему Вы можете использовать ElementCollection on Picture для сохранения списка вместо категорий 1 и 2. Это даст вам схему что-то вроде

TABLE PICTURE {
   long key;
}

TABLE PICTURE_CATEGORY {
    long picture_key;
    String category_name;
}

ИЛИ вы можете снова сопоставить Category с сущностью и использовать ManyToMany из Picture в Category, которая выдаст вам схему, подобную

TABLE PICTURE {
   long key;
   ...
}

TABLE PICTURE_CATEGORY {
    long picture_key;
    long category_key;
}

TABLE CATEGORY {
    long key;
    String name;
}

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

2 голосов
/ 28 ноября 2011

Из вашего описания, PICTURE.category1 и PICTURE.category2 имеют отношение многие-к-одному с PICTURE_REF

Ниже показано двунаправленное отображение между ними с помощью аннотации:

Для таблицы КАРТИНА:

@Entity
@Table(name="PICTURE")
public Class Picture{

   @Id
   private Integer id;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "category1")
   private PictureRef category1, 

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "category2")
   private PictureRef category2;


   //getter and setters 

}

Для таблицы PICTURE_REF:

@Entity
@Table(name="PICTURE_REF")
public Class PictureRef{

   @Id
   private Integer id;

   @OneToMany(mappedBy = "category1")
   List <Picture> listOfCat1Picture= new ArrayList<Picture>();  

   @OneToMany(mappedBy = "category2")
   List <Picture> listOfCat2Picture= new ArrayList<Picture>(); 

   //getter and setters 

}

Важные моменты:

  • @Entity помечает класс Java как спящий объект. Он сопоставлен с именем таблицы, указанной в @Table

  • Используйте @ManyToOne для определения отношения многие-к-одному

    В реляционной базе данных отношение многие-к-одному выражается с использованием следующего ограничения внешнего ключа: «Таблица многих сторон» имеет столбец FK, который принимает только PK «таблицы одной стороны».

    В вашем случае это столбцы FK PICTURE.category1 и PICTURE.category2. Имя этих столбцов FK может быть явно определено атрибутом name @JoinColumn.

  • FetchType.EAGER означает, что PictureRef будет с нетерпением выбираться при загрузке Picture или получении

  • В зависимости от ваших требований вы можете выполнить отображение unidirectional, пропустив @OneToMany в PictureRef. Это также будет работать. Но учитывая PictureRef, вы не можете получить доступ к его изображению

  • Учитывая экземпляр Picture, вы можете получить его categoryName и categoryId по

    • picture.getCategory1 (). GetCategoryName ()
    • picture.getCategory1 (). GetId ()
    • picture.getCategory2 (). GetCategoryName ()
    • picture.getCategory2 (). GetId ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...