Играть!Framework: как превратить сущность из родительского класса в дочерний класс - PullRequest
2 голосов
/ 06 февраля 2012

Предположим, у меня есть система, которая выполняет аудит действий пользователя: как пользователь по имени XXX, сделал чашку чая, а затем сделал ..., затем сделал ...

поэтому есть таблица с UserActions (userId, actionId)

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

как: конкретный родительский объект:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User extends Model {
}

конкретная дочерняя сущность:

@Entity
public class MarriedUser extends User {
    @OneToMany()
    public List<User> children;
}

и моя проблема заключается в том, как записать код в контроллере для продвижения сущности в базе данных от родителя (пользователя) к потомку (MarriedUser) - обычно это делается в базе данных, просто вставляя новую запись в Таблица MarriedUser с тем же идентификатором пользователя (как я делаю объединение InheritanceType), поэтому в базе данных это просто, но код гибернации это то, чего я не знаю.

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

поэтому, пожалуйста, помогите мне с кодом гибернации ...

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я думаю, что вы столкнулись с проблемами из-за злоупотребления наследованием.

Вы не можете изменить тип объекта, не потеряв его идентичность объекта, поэтому вы не должны использовать наследование для представления разных состояний одного и того жеобъект, как вы пытаетесь сделать.

Вы можете использовать отдельные объекты для представления семейного положения User:

@Entity 
public class User extends Model {
    @OneToOne
    public Marriage marriage;
    ...
}

@Entity 
public class Marriage extends Model {
    @OneToMany()
    public List<User> children; 
}

В качестве альтернативы, вы можете переместить children в User и используйте какой-либо флаг для представления семейного положения, если вам нужно.

И да, насколько я знаю, нет способа изменить тип существующего объекта в Hibernate.

0 голосов
/ 08 февраля 2012

Я считаю, что вы подходите к своей проблеме неправильно. Здесь у вас есть 'конечный автомат' , в котором сущность (ваш пользователь) может находиться в некоторых состояниях, которые разрешают / запрещают определенные действия.

Вы можете добиться большего успеха, развязав состояние сущности и ее хранилища. Используйте enum (или аналогичный) для хранения состояния, а затем проверьте правильность состояния при попытке вызвать действие в Модели. Если это недопустимое состояние, создайте исключение.

Ваш пользовательский интерфейс должен ограничивать диапазон доступных действий в соответствии с кодом состояния.

@Entity 
 public class User extends Model {

    // this status code could be an enum, or any other type that fits
    public int statusCode;

    ...

    public void action() {
        if(statusCode != 1){
          throw new IllegalStateException("State 1 required for this action");
        }
        //code for action
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...