簡體   English   中英

如何在 hibernate 中將父 class 向下轉換為繼承的子 class?

[英]How to downcast parent class to inherited child class in hibernate?

我有以下課程:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class UserDO{
    // ...
}

@Entity
public class ReviewerDO extends UserDO{
    private String reviewerType;
}

所以應該可以實例化一個用戶。 在某些時候,用戶可能會被提升為更專業的用戶(例如ReviewerDO )。 因此,以下服務負責促銷:

    public void assignUserToReviewer(UserDO userDO) {
        ReviewerDO reviewerDO = (ReviewerDO) userDO;
        reviewerDO.setReviewerType("COMPLIANCE");
        reviewerRepository.save(reviewerDO);
    }

它失敗了,因為它無法將UserDO類型轉換為ReviewerDO

無法將 UserDO 強制轉換為 Reviewer

如何做到這一點?

有兩種類型轉換方法:

  • 向上轉換(子 class 到父 class 和子 class 到子類)

  • 向下轉換(父class到子類)

您面臨的問題的示例。

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

    }

}

Output:

Exception in thread "main" java.lang.ClassCastException: com.example.UserDO cannot be cast to com.example.ReviewerDO

解決方案可以有兩種方式:

  1. 間接向下轉換。

例如:

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.

        }

    }
  1. 推薦:創建您自己的助手 class 並創建自定義方法以使用 getter 和 setter 將一個 object 的值復制到另一個。

例如:

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;
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM