題 :
我需要在我的介面 IAbstractUserService 上洗掉泛型嗎?
它與型別擦除有關嗎?https://stackoverflow.com/a/31266152/6698175
問題 :
我得到了這個例外:
org.hibernate.WrongClassException: Object [id=1] was not of the specified subclass [com.faz.idb.models.Adviser] : loaded object was of wrong class class com.faz.idb.models.Customer
嘗試加載物體時:
T getUserByEmail(String email);
像這樣:
AbstractUserServiceImpl<? extends AbstractUser> userService;
AbstractUser user = userService.getUserByEmail(email);
目前我有:
hibernate v7.0.3.Final
一個抽象父類:AbtrsactUser
子類:客戶和顧問;
@Getter
@Setter
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "user_type", discriminatorType = DiscriminatorType.STRING)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(name = "customer", value = Customer.class),
@JsonSubTypes.Type(name = "adviser", value = Adviser.class)
})
@DiscriminatorOptions(force = true)
public abstract class AbstractUser { ........ }
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@DiscriminatorValue("adviser")
@DiscriminatorOptions(force = true)
public class Adviser extends AbstractUser { ........ }
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@DiscriminatorValue("customer")
@DiscriminatorOptions(force = true)
public class Customer extends AbstractUser { ........ }
服務 :
public interface IAbstractUserService<T extends AbstractUser> {
T getUserByEmail(String email);
執行 :
@Service public class AbstractUserServiceImpl<T extends AbstractUser> implements IAbstractUserService<T> {
@Autowired
private AbstractUserRepository<T> userRepository;
@Override
public T getUserByEmail(String email) {
return userRepository.findByEmail(email).orElse(null);
}
存盤庫:
@Repository 公共介面 AbstractUserRepository 擴展 JpaRepository<T, Long> { 可選 findByEmail(String email); }
生成的 SQL:
Hibernate:選擇 abstractus0_.id 作為 id2_0_,abstractus0_.email 作為 email3_0_,abstractus0_.password 作為 password4_0_,abstractus0_.user_type 作為 user_typ1_0_ from abstract_user abstractus0_ where abstractus0_.user_type in ('adviser', 'customer') and abstractus0_.email=?
休眠:選擇 person0_.customer_id 作為 customer1_5_0_,person0_.first_name 作為 first_na2_5_0_,person0_.gender 作為 gender3_5_0_,person0_.last_name 作為 last_nam4_5_0_,advisor1_.id 作為 id2_0_1_,advisor1_.email 作為 email3_0_1_,advisor1_.password 作為密碼 4_0_1_ 來自 person0_ 左外連接abstract_user advisor1_ on person0_.customer_id=adviser1_.id where person0_.customer_id=? 2022-03-14 06:14:34.029
INFO 79095 --- [nio-8080-exec-2] oheinternal.DefaultLoadEventListener:HHH000327:執行加載命令時出錯
在我的資料庫中,我只有一個用戶:
用戶型別 | 編號 | 電子郵件 | 密碼
客戶 | 1 | [email protected] | ……
uj5u.com熱心網友回復:
問題解決了。
我在@OneToOne 關系的子物體中使用了沒有@JoinColumn(name="id") 的@MapsId。
解釋:
“AbstracUser”由“客戶”物體擴展,他與“PersonDetails”有@OneToOne 關系。
所以在客戶中我有:
@OneToOne(mappedBy = "Customer", fetch = FetchType.LAZY,
cascade {CascadeType.ALL}, optional = false)
@PrimaryKeyJoinColumn private PersonDetails person;
和 PersonDetails :
@MapsId()
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name="id")
private Customer customer;
解決方案是將參考的列添加到
@MapsId("id")
要么
@MapsId
@JoinColumn(name="id")
注意
- 還要確保通過“設定”它們對應的物件來同步關系的雙方。(我使用的資源)
- 為了更好的架構,我最終將@OneToOne 關系放在“AbstractUser”物體中(而不是在客戶中)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/445645.html
上一篇:H2Oracle模式-“BOOLEAN”和“INTEGER”型別的值不可比較
下一篇:為什么Hibernate沒有使用@ManyToMany和@JoinTable注釋在這個MANYTOMANY關聯表上執行JOIN?
