hibernate未绑定类型,使用泛型时没有显式的目标实体

5f0d552i  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(354)

我有以下两门课:

  1. @Entity
  2. @Table(name = "criteria")
  3. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  4. @DiscriminatorColumn(name = AbstractCriteria.TYPE, discriminatorType = DiscriminatorType.STRING)
  5. public abstract class AbstractCriteria<T> implements Serializable {
  6. public static final String TYPE = "type";
  7. ...
  8. @Column(name = "clazz") private Class<T> clazz;
  9. ...
  10. protected AbstractCriteria(Class<T> clazz) {
  11. this.clazz = Preconditions.checkNotNull(clazz);
  12. }
  13. ...
  14. public abstract Predicate<T> evaluate(T value);
  15. }
  16. @Entity
  17. @DiscriminatorValue(CriteriaType.Values.DATETIME_IS_BETWEEN)
  18. public class DateTimeIsBetweenCriteria extends AbstractCriteria<DateTime> {
  19. ...
  20. public DateTimeIsBetweenCriteria() {
  21. super(DateTime.class);
  22. }
  23. ...
  24. @Override
  25. public Predicate<DateTime> evaluate(DateTime value) {
  26. ...
  27. }
  28. }

当我试图保存datetimeisbetweencriteria类的示例时,出现以下异常:

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

我需要 clazz 对于中的方法 AbstractCriteria ,和 T 可以是字符串、日期时间、布尔值等。
我在考虑
clazz @Transient ,但如果这样做,我仍然需要另一个列来标识要保存的条件,以便在从数据库加载条件时,我知道它是哪种条件。我觉得这有点麻烦。
有什么想法我可以解决这个例外而不改变我的设计?
非常感谢你抽出时间。

zed5wv10

zed5wv101#

我已将实现更改为不使用参数化类型:

  1. @Entity
  2. @Table(name = "criteria")
  3. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  4. @DiscriminatorColumn(name = AbstractCriteria.TYPE, discriminatorType = DiscriminatorType.STRING)
  5. public abstract class AbstractCriteria implements Serializable {
  6. public static final String TYPE = "type";
  7. ...
  8. @Column(name = "clazz") private Class clazz;
  9. ...
  10. protected AbstractCriteria(Class clazz) {
  11. this.clazz = Preconditions.checkNotNull(clazz);
  12. }
  13. ...
  14. public abstract Predicate evaluate(Object value);
  15. }
  16. @Entity
  17. @DiscriminatorValue(CriteriaType.Values.DATETIME_IS_BETWEEN)
  18. public class DateTimeIsBetweenCriteria extends AbstractCriteria {
  19. ...
  20. public DateTimeIsBetweenCriteria() {
  21. super(DateTime.class);
  22. }
  23. ...
  24. @Override
  25. public Predicate evaluate(Object value) {
  26. if (value instanceof DateTime) {
  27. // do evaluation and return here.
  28. } else {
  29. throw new UserDefinedException("...");
  30. }
  31. }
  32. }
展开查看全部
oipij1gg

oipij1gg2#

就泛型而言,您的思路是正确的,但是您正在尝试持久化“class”类型的类。数据库没有可以直接Map到的数据类型(因此是您的错误),我能想到的最接近的方法是使用字符串作为类名;

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

并设置

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

检索类;

  1. Class.forName(classname);

但是如果我对您正在做的事情有正确的想法,那么您根本不需要持久化这个类:所有datetimeisbetweencriteria示例与operation on-datetime-它是类的模板参数,而不是示例。你应该坚持你的约会间隔,而不是班级的行为。

相关问题