Java 如何在hibernate中从一个类转换到另一个类

Java 如何在hibernate中从一个类转换到另一个类,java,hibernate,jpa,Java,Hibernate,Jpa,假设有三个类: 一是: @Entity @Indexed @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) @Table(name = "tbl_a") public class A { @Id @DocumentId @GeneratedValue(g

假设有三个类:

一是:

@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,那么它将给出类强制转换异常。请告诉我合并时如何在hibernate中强制转换类

我的方法是这样的:

//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);

你就是不能。Hibernate在将对象持久化到数据库时保持对象类型。Java防止在对象不兼容时将对象从一种类型转换为另一种类型

在您的情况下,无法在
B
中强制转换
C
的实例。这就像将
字符串
转换为
整数


最好的方法是编写一个方法,该方法以
C
为例,将
C
的所有属性复制到
B
类型的新对象中
adminService.getA(request.getParameter(“id”)实际做什么?如果它执行以下操作:

hibernateSession.get(A.class,id)

然后Hibernate将从具有该id的行中获取相应的值,并创建作为参数传递的类A的实例(这就是为什么要从javadocs中传递它:“返回具有给定标识符的给定实体类的持久实例”)。这意味着,即使您已经声明了Hibernate继承,使得实体C扩展了实体B扩展了实体A,并且相应的类以相同的方式相互扩展,Hibernate实际上也会创建A的实例(而不是作为A寻址的B或C的实例),因此A的实例不能转换为B

但是,如果id对应于类型为B的行(比方说),那么如果

A a = hibernateSession.get(B.class,id);
那你就可以了

B b = (B)a;
因为您的“a”对象实际上是类型B(即使您最初将其视为a)。但是,在这种情况下,只需执行以下操作会更简单:

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

同样,如果您实际使用该id在行中保存了一个类型为B(或C)的实体(即,您的鉴别器列包含类型B或C的值),则上述操作将起作用。

Yup。这本身不是一个休眠问题;这是一个Java问题,甚至不是Java问题,而是一个实现/设计问题