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;
      }
    
    }
    
  • 推荐:创建您自己的助手类,并创建自定义方法,使用getter和setter将一个对象的值复制到另一个对象中
  • 例如:

    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
    对象中的字段值复制到该对象中。