簡體   English   中英

是否可以保留對象的類?

[英]Is it possible to persist the Class of an object?

我創建了一個Entity類,並創建了一個我想成為對象的字段,即我不希望( 也不能 )將一個具體對象保留在該字段中。 例如,我創建並抽象了一個 ,它是我想保留的所有后代的

public abstract class RootType implements Serializable {
private String name;
private Date date;

public void setName(String name){
    this.name = name;
}

public void setDate(Date date) {
    this.date = date;
}

public String getName(){
    return name;
}

public Date getDate(){
    return date;
}
}

還有RootType兩個后代:

public class FloatData extends RootType {
Float data;

public void setData(Float data){
    this.data = data;
}

public Float getData(){
    return data;
}
}

public class StringData extends RootType {
String data;

public void setData(String data){
    this.data = data;
}

public String getData(){
    return data;
}
}

實際的Entity類具有對RootType或其后代之一的引用:

@Entity
public class Customer implements Serializable {
@Id
@GeneratedValue
private Long id;
private Class c;

// standard methods omitted for clarity
public void setC(Class c){
    this.c = c;
}

public Class getC(){
    return c;
}
}

我的問題是:

  1. 這是實現此目標的有效方法嗎?
  2. 如果有效,是否將有關類的最少數據放入數據庫中,即僅是對該類的某種引用?
  3. 有沒有一種方法可以將Class限制為RootType.class類型,或者每個 Customer實體的c字段都是RootType.class即使它實際上是后代?

我可以使用Enum類型,但是立即將其限制為在編譯時說明我可以擁有的.class而我寧願避免這種情況。

為什么不將其更改為String

public class Customer implements Serializable {
...
   private String c;
...
}

要存儲它,您可以:

customer.setC(clazz.getName());

並將其作為Class收回:

Class<?> clazz = Class.forName(customer.getC());

1.是的,這是有效的,盡管您需要使用@Lob注釋c字段

2.Well,我懷疑只有很少的數據可以保留,但是您可以自己檢查一下。 此外,最大的問題是,如果您堅持這樣的課程,然后再更改您的課程並重新部署,則會遇到一些無法實現的問題。 這就是為什么我建議您保存該類的Class.getSimpleName()的原因。

3.如果我正確理解問題:是的,請執行以下操作:

public void setC(Class<? extends RootType> c) {
    this.c = c;
}

暫無
暫無

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

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