gpt4 book ai didi

java - 使用泛型时 Hibernate 未绑定(bind)类型和没有明确的目标实体

转载 作者:行者123 更新时间:2023-12-05 07:41:49 24 4
gpt4 key购买 nike

我有以下两个类:

@Entity 
@Table(name = "criteria")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = AbstractCriteria.TYPE, discriminatorType = DiscriminatorType.STRING)
public abstract class AbstractCriteria<T> implements Serializable {

public static final String TYPE = "type";

...
@Column(name = "clazz") private Class<T> clazz;
...

protected AbstractCriteria(Class<T> clazz) {
this.clazz = Preconditions.checkNotNull(clazz);
}
...

public abstract Predicate<T> evaluate(T value);
}

@Entity
@DiscriminatorValue(CriteriaType.Values.DATETIME_IS_BETWEEN)
public class DateTimeIsBetweenCriteria extends AbstractCriteria<DateTime> {
...
public DateTimeIsBetweenCriteria() {
super(DateTime.class);
}
...


@Override
public Predicate<DateTime> evaluate(DateTime value) {
...
}
}

当我试图保存 DateTimeIsBetweenCriteria 类的一个实例时,我得到了这个异常:

Exception in thread "main" org.hibernate.AnnotationException: 
Property ...AbstractCriteria.clazz has an unbound type and no explicit target entity.
Resolve this Generic usage issue or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type

AbstractCriteria 中的方法需要 clazzT 可以是 String、DateTime、Boolean 等。

我正在考虑制作 clazz @Transient,但如果我这样做,我仍然必须有另一列来确定要保存的条件,以便在加载从数据库返回的标准,我知道它是哪种标准。我认为这有点 hacky。

有什么想法可以在不更改设计的情况下解决该异常吗?

非常感谢你的宝贵时间。

最佳答案

就泛型而言,您的路线是正确的,但您正试图保留一个类型为“Class”的类。数据库没有可以直接映射到的数据类型(因此你的错误),我能想到的最接近的是使用字符串作为类名;

@Column (name="className")
private String classname;

并设置为

.... setClassname (DateTime.getCanonicalName());

检索类;

Class.forName(classname);

但是,如果我对您正在做的事情有正确的想法,那么您根本不需要保留类:所有 DateTimeIsBetweenCriteria 实例都在 DateTime 上运行 - 它是类的模板参数,而不是实例。你应该坚持你的间隔日期而不是类(class)的行为。

关于java - 使用泛型时 Hibernate 未绑定(bind)类型和没有明确的目标实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45109016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com