Hibernate Неизменный Объект Значения - PullRequest
0 голосов
/ 09 октября 2009
customer = // get customer from the current hibernate session
// customer has a discount with database id of 1

Пока все хорошо. Но если я позвоню:

discount = SpecialDiscount.create("10%");
customer.setDiscountTo(discount);

session.save(customer);
// customer has a discount with database id of 2 now

Как hibernate может обновить ту же строку скидки с идентификатором 2, даже если я установил ее для другого объекта значения скидки? Кроме того, я хочу предотвратить ошибки «объект с той же идентичностью уже существует», отсоединив предыдущую или около того. Что вы предлагаете?

// An entity
class Customer {
    // one-to-one mapped immutable value object
    SpecialDiscount discount;

    SpecialDiscount discount() {
        return SpecialDiscount.create(this.discount);
    }

    void setDiscountTo(SpecialDiscount discount) {
        this.discount = SpecialDiscount.create(discount);
    }
}

Ответы [ 3 ]

0 голосов
/ 09 октября 2009

Возможно, что-то происходит с автоинкрементом столбца id как в Hibernate, так и через базу данных. Разместите свое сопоставление и проверьте свойства столбца в базе данных. Это помогло бы каждому диагностировать проблему.

Еще одна вещь. (Я только знаком с NHibernate, так что это может не применяться.) Чтобы выполнить обновление строки, обычно нужно вызвать Update() или SaveOrUpdate() вместо Save(). Был ли вызов Save() изменить существующую запись или создать новую в базе данных с id = 2?

0 голосов
/ 11 января 2012

Для хранения неизменяемого объекта-значения с отображением «один-к-одному» в идеале следует использовать компонент, известный как встроенные объекты в терминах гибернации. Более подробную информацию можно найти здесь .

Также обратите внимание на @ неизменную аннотацию

Опубликуйте свои сопоставления, и вы должны получить больше ответов:)

0 голосов
/ 09 октября 2009

Вы не опубликовали свои сопоставления, которые делают невозможным точную диагностику проблемы, и ваши методы доступа выглядят довольно странно (почему вы все оборачиваете с помощью SpeciaalDiscount.create()? Вы даже делаете это дважды на съемочной площадке, используя пример, который вы ' ve отправил).

Тем не менее, если вы действительно сопоставили клиента со скидкой как один-к-одному (как вы сказали в комментарии), Hibernate ведет себя так, как и должен (обновляя существующую запись "скидки"). Возможно, вам следует вместо этого использовать многие-к-одному (опять же, трудно сказать наверняка, не понимая, что вы пытаетесь сделать).

...