仅在类型很重要时,在JPA中保留成员变量

时间:2013-04-09 00:14:14

标签: java jpa serialization jpa-2.0

问题:如果字段只有其类型很重要,如何存储字段。

说明:我已简化问题说明以突出显示该问题。类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();
    }
}

1 个答案:

答案 0 :(得分:1)

如果您使用的是EclipseLink,可以使用Converter。

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_converter.htm#CHDEHJEB

具体来说,您可以使用ClassInstanceConverter来存储列中类的名称。

JPA 2.1还将定义转换器概念。