В вашем вопросе отсутствуют некоторые детали, поэтому следующее требует много догадок :-)
Ваш Country
класс должен выглядеть примерно так:
@Entity
@Immutable
@Table(name="countries")
public class Country {
@Id
private String isoCode;
// all other attributes, getters / setters, etc...
}
@Immutable
- это расширение Hibernate по стандарту JPA; Вы не должны помещать его в сущность, но наличие этого приведет к немного лучшей производительности. Имейте в виду, что действительно сделает Country
неизменным - вы не сможете создавать / обновлять / удалять страны через ваше приложение. Вы также можете настроить кеш для вашей сущности Country
, если она используется достаточно часто.
Ваш Address
будет иметь следующую привязку к стране:
@ManyToOne
@JoinColumn(name="country_iso_code")
private Country country;
Обратите внимание на отсутствие атрибутов "каскад" - они вам не нужны. Последнее важное замечание: вам нужно получить или загрузить экземпляр Country
, чтобы установить его по адресу:
Country country = (Country) session.load(Country.class, isoCode);
// OR
Country country = (Country) session.get(Country.class, isoCode);
address.setCountry(country);
...
session.saveOrUpdate(address);
Первая строка выше не попадет в базу данных; используйте его, если вы знаете, что страна с таким кодом ISO существует. Вторая форма будет попадать в базу данных (или в кеш, если настроено) и возвращать NULL, если страны с таким кодом не существует.