Java 如何在hibernate中将父类向下转换为继承的子类?
我有以下课程:Java 如何在hibernate中将父类向下转换为继承的子类?,java,hibernate,inheritance,Java,Hibernate,Inheritance,我有以下课程: @实体 @继承(策略=InheritanceType.JOINED) 公共类UserDO{ // ... } @实体 公共类ReviewerDO扩展了UserDO{ 私有字符串类型; } 因此,应该可以实例化一个用户。在某个时候,用户可能会被提升为更专业的用户(例如ReviewerDO)。因此,以下服务负责促销: public void assignUserToReviewer(UserDO-UserDO){ ReviewerDO ReviewerDO=(ReviewerDO)
@实体
@继承(策略=InheritanceType.JOINED)
公共类UserDO{
// ...
}
@实体
公共类ReviewerDO扩展了UserDO{
私有字符串类型;
}
因此,应该可以实例化一个用户。在某个时候,用户可能会被提升为更专业的用户(例如ReviewerDO
)。因此,以下服务负责促销:
public void assignUserToReviewer(UserDO-UserDO){
ReviewerDO ReviewerDO=(ReviewerDO)userDO;
reviewerDO.setReviewerType(“合规性”);
reviewerRepository.save(reviewerDO);
}
它失败,因为它无法将UserDO
类型转换为ReviewerDO
:
无法将UserDO强制转换为审阅者
如何实现这一点?有两种类型转换方法:
- 向上投射(子类到父类以及子类到子类)
- 向下广播(父类到子类)
package com.example;
class UserDO {
//..
}
class ReviewerDO extends UserDO {
private String reviewerType;
public ReviewerDO(String reviewerType) {
this.reviewerType = reviewerType;
}
}
public class Example {
public static void main(String[] args) {
UserDO user = new UserDO(); // upcast (child to child)
/*
* This will throw ClassCastException as direct downcasting
* is not possible.
*/
ReviewerDO reviewerDO = (ReviewerDO) user; //downcast
}
}
输出:
Exception in thread "main" java.lang.ClassCastException: com.example.UserDO cannot be cast to com.example.ReviewerDO
解决方案可以有两种方式:
package com.example;
class UserDO {
//..
}
class ReviewerDO extends UserDO {
private String reviewerType;
public ReviewerDO(String reviewerType) {
this.reviewerType = reviewerType;
}
}
public class Example {
public static void main(String[] args) {
UserDO user = new ReviewerDO(); // upcast (child to parent)
/*
* Here downcasting happens. This doesn't throw
* ClassCastException.
*/
ReviewerDO reviewerDO = (ReviewerDO) user; //downcast happens indirectly.
}
}
public void assignUserToReviewer(UserDO userDO) {
ReviewerDO reviewerDO = Helper.createReviewerDO(userDO);
reviewerDO.setReviewerType("COMPLIANCE");
reviewerRepository.save(reviewerDO);
}
public final class Helper {
public static ReviewerDO createReviewerDO(UserDO userDO) {
ReviewerDO r = new ReviewerDO();
r.setSomething(userDO.getSomeThing());
...
return r;
}
}
package com.example;
class UserDO {
//..
}
class ReviewerDO extends UserDO {
private String reviewerType;
public ReviewerDO(String reviewerType) {
this.reviewerType = reviewerType;
}
}
public class Example {
public static void main(String[] args) {
UserDO user = new ReviewerDO(); // upcast (child to parent)
/*
* Here downcasting happens. This doesn't throw
* ClassCastException.
*/
ReviewerDO reviewerDO = (ReviewerDO) user; //downcast happens indirectly.
}
}
public void assignUserToReviewer(UserDO userDO) {
ReviewerDO reviewerDO = Helper.createReviewerDO(userDO);
reviewerDO.setReviewerType("COMPLIANCE");
reviewerRepository.save(reviewerDO);
}
public final class Helper {
public static ReviewerDO createReviewerDO(UserDO userDO) {
ReviewerDO r = new ReviewerDO();
r.setSomething(userDO.getSomeThing());
...
return r;
}
}
强制转换不会自动将一种类型的对象转换为另一种类型的对象。您必须创建一个新的
RevieweDO
对象,并将原始UserDO
对象中的字段值复制到该对象中。