Возьмем, к примеру эти две сущности:Hibernate: использовать тот же внешний ключ, если x.equals (у)
Город:
<class name="City" table="city">
<id name="id" column="id"/>
<property name="city_name" column="city_name"/>
<property name="country_name" column="country_name"/>
</class>
лицо:
<class name="Person" table="person">
<id name="id" column="id"/>
<property name="name" column="name"/>
<many-to-one cascade="save-update" name="city" column="city_id" class="City"/>
</class>
City.equals()
реализация возвращает true
если оба city_name
и coutry_name
одинаковы.
Если я сохранить два Person
во время одного сеанса:
Person person1 = new Person("Peter");
Person person2 = new Person("John");
City city1 = new City("Paris", "France");
City city2 = new City("Paris", "France");
person1.setCity(city1);
person2.setCity(city2);
session.save(person1);
session.save(person2);
Hibernate будет производить следующие записи:
город:
| id | name | city_id |
-------------------------
| 1 | Peter | 1 |
| 2 | John | 2 |
лицо:
| id | city_name | country_name |
----------------------------------
| 1 | Paris | France |
| 2 | Paris | France |
Но могу ли я использовать Hibernate для повторного использования тех же city_id
в person
, когда cityX.equals(cityY)
?
EDIT:
я должен уточнить, что city1
не может быть такой же, как экземпляр city2
. Для краткости я не могу описать всю проблему, с которой я столкнулся. В фактическом случае таблица может содержать элементы дубликатов, я просто пытаюсь сохранить некоторое пространство, группируя некоторые конкретные элементы. Спасибо!
Думаю, что в этом случае вы столкнулись с проблемой, потому что вы используете новый объект City на человека. Для Hibernate следует признать, что они фактически являются одним и тем же объектом, один и тот же объект (например, city1) необходимо повторно использовать. Обычно вы можете искать город в БД по имени и стране и использовать этот объект столько раз, сколько необходимо, назначив его каждому человеку. – Durandal
Возможно, это не ответ на ваш вопрос, но указатель на дизайн базы данных: у вас действительно должно быть УНИКАЛЬНОЕ ограничение на ваши имена city_name и country_name. Это приведет к сбою ошибок, которые дублируют данные, а не оставляют их, чтобы, возможно, вызвать неясные сбои на более позднем этапе. – Jules
Почему ограничение города? Использование разных экземпляров для одного и того же объекта в базе данных или сохранение нескольких записей и их сохранение не имеет никакого смысла, по крайней мере для меня. – Gamb