Представление страны в спящем режиме - PullRequest
1 голос
/ 11 ноября 2011

Я в процессе переноса моего проекта JDBC в Hibernate.У меня есть вопрос относительно справочных данных, хранящихся в моей БД, в частности, это список стран ООН.Я взял это из здесь .

Когда я использовал JDBC, у меня просто была таблица, содержащая эти данные, и я использовал ее для проверки данных в БД.например, пользователь не может указать, что он живет в стране, которой нет в этой таблице.

Теперь у меня есть Pojo, представляющий человека, и у меня есть строковый член, представляющийстрана, как мне сохранить это в Hibernate, нужно ли создавать Pojo для страны?Как я могу ссылаться на приведенный ниже код на «справочную таблицу», которая не является pojo?

@OneToOne
@JoinColumn(name = "country_iso")
private String country;

приведенный выше код, это то, что я начал писать, но я не знаю, является ли этоспособ сделать это.

Ответы [ 3 ]

4 голосов
/ 11 ноября 2011

Я думаю, что это хорошая идея - создать класс Country, используя iso-код в качестве идентификатора.

Вам необходимо установить отношение многие-к-одному, так как в одной стране может существовать множество людей.

Страна:

@Id
String id;

Персона:

@ManyToOne
@JoinColumn(name="COUNTRY", referencedColumnName="ID") 
Country country;

Таким образом, вы можете загрузить все страны как коллекцию, используя Hibernate, и вы можете настроить правила дляотношение (например, необязательно = ложь и т. д.)

3 голосов
/ 14 ноября 2011

Я бы предложил вам создать сущность для страны, например

import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@org.hibernate.annotations.Entity(mutable=false) //since this table is supposed to
@Table(name="Countries")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Country{
@Id
String ccode;
String name;
}

, с помощью этого сопоставления вы отобразите Country pojo в таблицы стран, а также установите для этой сущности неизменный и включенный кэш 2L (этолучший вариант для включения кеша 2L со стратегией readonly)

1 голос
/ 11 ноября 2011

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

У вас есть поле для countryId в классе Person.

@Column(name = "country_iso")
private String countryId;

, когда вы хотитесохранить Person в базе данных получить идентификатор страны в зависимости от названия страны (из базы данных) и установить для него значение страны * из Person.Затем сохраните Person.

. У вас может быть POJO для Country и, если нужно, укажите его в классе Person.

...