问题:如果字段只有其类型很重要,如何存储字段。
说明:我已简化问题说明以突出显示该问题。类Dragon
具有行为Roar
,该行为存储为成员变量。 Roar
通常没有状态,也不需要保存。但是,Dragon
需要知道重新创建时它具有的Roar
具体类型。
@Entity
public class Dragon implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private double height;
private Roar roar;
public String roar() {
return roar.roar();
}
}
public interface Roar {
String roar();
}
public class QuietRoar implements Roar {
public String roar() {
return "grr.."; // In real scenario, lots of logic occurs here.
}
public class LoudRoar implements Roar {
public String roar() {
return "AHHHGRRRR"; // More logic here.
}
可能的解决方案:
使roar
字段成为瞬态,并存储类型为Class
的其他字段,其中包含roar
字段的类类型。然后Dragon
类成为:
@Entity
public class Dragon implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private double height;
@Transient
private Roar roar;
private Class<? extends Roar> roarType;
public void setRoar(Roar roar) {
this.roar = roar;
roarType = roar.getClass();
}
public String roar() {
if(roar == null) {
try {
roar = roarType.newInstance();
} catch (InstantiationException | IllegalAccessException ex ) {
// oo ohh..
}
}
return roar.roar();
}
}
答案 0 :(得分:1)
如果您使用的是EclipseLink,可以使用Converter。
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_converter.htm#CHDEHJEB
具体来说,您可以使用ClassInstanceConverter来存储列中类的名称。
JPA 2.1还将定义转换器概念。