使用带接口的DetachedCriteria进行Hibernate

时间:2012-01-03 16:12:47

标签: java hibernate detachedcriteria

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

示例:

在基类中:

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

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

e.g。

@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来回传它需要创建的类的实例吗?

1 个答案:

答案 0 :(得分:0)

我不确定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;
}

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