是否可以持久化对象的类?

时间:2013-11-30 23:16:39

标签: java jpa persistence

我创建了一个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;
}
}

我的问题是:

  1. 这是实现这个目标的有效方法吗?
  2. 如果有效,是否将最少的数据放入有关类的数据库中,即只是对它的某种引用?
  3. 有没有办法将类限制为类型RootType.class每个客户实体的c字段为RootType.class,即使它实际上是后代?
  4. 我可以使用Enum类型但是这会立即限制我在编译时说明.class我可以拥有什么,我宁愿避免这种情况。

2 个答案:

答案 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;
}
相关问题