Как я могу привести из одного класса в другой в спящем режиме - PullRequest
1 голос
/ 30 ноября 2011

Предположим, есть три класса:

Один из них:

@Entity
@Indexed
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@Table(name = "tbl_a")
public class A {
    @Id
    @DocumentId
    @GeneratedValue(generator="rwSpecSeq")
    @SequenceGenerator(name="rwSpecSeq", sequenceName="RW_SPEC_SEQ")
    private int id;
    private String sampleAttribute;

    //Getters and Setters
}

@Entity
@DiscriminatorValue("b")
public class B extends A {
}

@Entity
@DiscriminatorValue("c")
public class C extends A {
}

Если один объект сохраняется как объект B, тогда, если я снова хочу привести объект или изменить объект на C, тогдадает исключение приведения класса.Подскажите, пожалуйста, как привести класс в режим гибернации при слиянии.

Мой подход был примерно таким:

//Assuming that the object is C class' object.
A a = adminService.getA(request.getParameter("id"));
//before merging I did this
B b = (B)a;
adminService.save(b);

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Ты просто не можешь. Hibernate сохраняет тип объектов, когда они сохраняются в базе данных. А Java предотвращает приведение объектов из одного типа в другой, когда они несовместимы.

В вашем случае вы не можете разыграть экземпляр C в B. Это было бы как бросить String в Integer.

Ваш лучший способ - написать метод, который принимает экземпляр C и копирует все атрибуты C в новый объект типа B.

0 голосов
/ 30 ноября 2011

Что на самом деле делает adminService.getA(request.getParameter("id"));?Если он делает что-то вроде:

hibernateSession.get (A.class, id);

, тогда Hibernate извлечет соответствующие значения из строки с этим идентификатором и создаст экземпляр классаА вы передали в качестве аргумента (вот почему вы передаете его от javadocs: «Вернуть постоянный экземпляр данного класса сущностей с заданным идентификатором»).Это означает, что даже если вы объявили свое наследование Hibernate таким образом, что Entity C расширяет Entity B, расширяет Entity A, а соответствующие классы расширяют друг друга таким же образом, Hibernate фактически создаст экземпляр A (не экземпляр B или C).который вы называете как A), так что экземпляр A не может быть приведен к B.

Если, однако, идентификатор соответствует строке, которая имеет тип B (скажем так), то если вы выполните

A a = hibernateSession.get(B.class,id);

тогда вы можете сделать

B b = (B)a;

, потому что ваш объект "a" является типом B (даже если вы изначально рассматривали его как A).Однако в этой ситуации было бы проще сделать:

   B b = hibernateSession.get(B.class,id);

Опять же, вышеприведенное сработает, если вы на самом деле сохранили сущность типа B (или C) в строке с этим идентификатором (т.е. ваш дискриминатор)столбец содержит значение для типа B или C)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...