【问题标题】:avoid manually refresh entity to get Dtype from newly created entities避免手动刷新实体以从新创建的实体中获取 Dtype
【发布时间】:2013-02-02 19:23:54
【问题描述】:

我有一些实体继承了如下所示的 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);

如果 then 在其他一些 ejb 中使用

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

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

em.refresh(someEntity);

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

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

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

【问题讨论】:

  • 我在 jsf facelets 中使用它。 #{entity.dtype == 'ConcreteEntity'} 基本上我获取抽象实体的列表,然后根据类型以不同的方式显示它们。也许还有其他方法可以解决这个问题
  • 是的,效果很好!

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


【解决方案1】:

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

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

不完全干净,但可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多