避免手动刷新实体以从新创建的实体中获取Dtype

时间:2013-02-02 19:23:54

标签: java-ee entity jpa-2.0 ejb-3.1

我有一些实体继承了下面的AbstractEntity。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private int id;

    @Column(insertable = false, updatable = false)
    private String dtype;

    public String getDtype() {
        return dtype;
    }
}

然后我坚持一些扩展AbstractEntity的实体。

ConcreteEntity concreteEntity = new ConcreteEntity();
em.persist(concreteEntity);

如果在其他一些ejb中使用

获取此实体
someEntity = query.getResultList().get(0);        

返回的实例将有dtype == null直到

em.refresh(someEntity);

我想这是因为实体管理器返回一个缓存的实例,它不知道在em.persist()上插入了哪个dtype。

但我的问题是如何让查询返回实例设置dtype?

我正在使用glassfish 3.1.2.2(默认的jpa提供程序和包含的javadb)

1 个答案:

答案 0 :(得分:1)

为什么你甚至需要它? dtype是ORM所需的内部实现细节。您可以简单地使用Java类型来区分子类。例如。在Facelets上下文中,您可以尝试.getClass().getSimpleName()

#{entity.class.simpleName == 'ConcreteEntity'}

不完全清洁,但有效。