【问题标题】:Hibernate using DetachedCriteria with interfaces使用带有接口的 DetachedCriteria 进行休眠
【发布时间】:2012-01-03 16:12:46
【问题描述】:

使用 Hibernate 3.6.8.Final 和 Spring 3.0.5.RELEASE ,我正在尝试为具有多个实现的类添加一些 Common DAO 功能,这些实现被重写以实现特定的类,但它不适用于 DetachedCriteria .

例子:

在基类中:

public interface ICat {
    public void setMeowSound(String meow);
    public String getMeowSound();
}

然后每个继承的项目都会定义休眠注释。

例如

@Entity
@Table(name="SQUAWKY_CATS")
public class SquawkyMeowingCat implements ICat, Serializable {
    @Id
    @Column(name="SQUAWK_NAME")
    private String meow;

    public String getMeowSound() {
        return meow;
    }

    public void setMeowString(String meow) {
        this.meow = meow;
    }
}

这意味着我可以使用:

Criteria criteria = Session.createCriteria(ICat.class);

Spring/Hibernate 知道它会从特定项目的具体继承中提取 ICat 的注释。

但是,如果我尝试这样做:

DetachedCriteria subQuery = DetachedCriteria.forClass(ICat.class,"inner"); // etcetera

然后我在运行时为 ICat 获得一个未知实体。

现在这很有意义,因为第一个实例是从 Session 中创建它,因此它具有所需的所有配置,而 DetachedCriteria 是一个静态方法,但是在尝试执行时会出错

criteria.list()

此时它已经接收到 Session 并且应该知道 ICat 实际上是一个 SquawkyMeowingCat,它具有所有注释。

所以我的问题分为两部分:

1) 这是已知的行为,并且会永远这样吗?

2) 谁能想到一个简单的方法来解决它,而不使用接口和具体的 ClassHolder 来交还它需要创建的类的实例?

【问题讨论】:

    标签: java hibernate detachedcriteria


    【解决方案1】:

    我不确定 DetachedCriteria 的情况,但避免显式依赖具体类的一种方法可能是使用接口查询 Hibernate 的元数据:

    public <T> Class<? extends T> findEntityClassForEntityInterface(
        SessionFactory sessionFactory, 
        Class<T> entityInterface
    ) {
        for (ClassMetadata metadata : sessionFactory.getAllClassMetadata().values()) {
            Class entityClass = metadata.getMappedClass(EntityMode.POJO);
            if (entityInterface.isAssignableFrom(entityClass)) {
                return entityClass;
            }
        }
        return null;
    }
    

    关于说明性代码片段的健壮性的常见警告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2018-02-18
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2012-09-06
      • 1970-01-01
      相关资源
      最近更新 更多