我创建了一个Entity类,其中一个字段我想成为对象的 Class ,即我不希望(并且不能)持久化这个领域的具体对象。例如,我创建和抽象类,它是我希望坚持的所有后代的类:
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;
}
}
我的问题是:
RootType.class
或每个客户实体的c字段为RootType.class
,即使它实际上是后代?我可以使用Enum类型但是这会立即限制我在编译时说明.class
我可以拥有什么,我宁愿避免这种情况。
答案 0 :(得分:2)
为什么不将其更改为String
:
public class Customer implements Serializable {
...
private String c;
...
}
要存储它,你会这样做:
customer.setC(clazz.getName());
并将其作为Class
取回:
Class<?> clazz = Class.forName(customer.getC());
答案 1 :(得分:1)
1.是的,这是有效的,但您需要使用@Lob
为c
字段添加注释
2.好吧,我怀疑只保留了最小数据,但你可以自己检查一下。此外,最大的问题是,如果你坚持这样一个课程然后改变你的课程并重新部署,你将会遇到一些不实现的问题。这就是为什么我建议你保存班级的Class.getSimpleName()
。
3.如果我理解正确的问题:是的,通过这样做:
public void setC(Class<? extends RootType> c) {
this.c = c;
}