当前位置: 首页 > 面试题库 >

使用Hibernate持久保存接口集合

阎成天
2023-03-14
问题内容

我想和Hibernate保持我的小动物园:

@Entity
@Table(name = "zoo") 
public class Zoo {
    @OneToMany
    private Set<Animal> animals = new HashSet<Animal>();
}

// Just a marker interface
public interface Animal {
}

@Entity
@Table(name = "dog")
public class Dog implements Animal {
    // ID and other properties
}

@Entity
@Table(name = "cat")
public class Cat implements Animal {
    // ID and other properties
}

当我尝试保持动物园时,hibernate状态抱怨:

Use of @OneToMany or @ManyToMany targeting an unmapped class: blubb.Zoo.animals[blubb.Animal]

我知道-的targetEntity属性,@OneToMany但这意味着,只有猫狗可以住在我的动物园里。

有没有办法用Hibernate来持久化具有多个实现的接口集合?


问题答案:

接口上不支持JPA批注。从 Java Persistence with Hibernate (p.210):

请注意,JPA规范在接口上不支持任何映射注释!这将在规范的将来版本中解决。当您阅读本书时,Hibernate Annotations可能是可能的。

一种可能的解决方案是将抽象实体与TABLE_PER_CLASS继承策略一起使用(因为您不能在关联中使用映射的超类-不是实体)。像这样:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractAnimal {
    @Id @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    ...
}

@Entity
public class Lion extends AbstractAnimal implements Animal {
    ...
}

@Entity
public class Tiger extends AbstractAnimal implements Animal {
    ...
}

@Entity
public class Zoo {
    @Id @GeneratedValue
    private Long id;

    @OneToMany(targetEntity = AbstractAnimal.class)
    private Set<Animal> animals = new HashSet<Animal>();

    ...
}

但是保留接口IMO并没有太多优势(实际上,我认为持久性类应该是具体的)。

参考文献

  • 注释,继承和接口
  • 在一对多关系中使用MappedSuperclass
  • 与MappedSuperclass的多态关联会引发异常


 类似资料:
  • 我有以下100万个实体的关系,指导学生。mentor有复合主键,我在student中使用它作为外键 然后,我将上面的内容保持为下面的内容,但在student表为空的地方,只有mentor被保持。 我如何坚持与学生的导师?

  • 我有以下类结构: 我的目标是将生物对象保存在数据库的一个表中。SkillInterface的子类没有任何字段。因为它们决定了行为,所以我想将选择的SkillInterface类名转换成一个字符串,因为我只需要用skill.getClass()这样的字符串来保存creature的当前技能策略的类名。getSimpleName()。我尝试用@Converter注释实现,使用AttributeConve

  • 问题内容: 我试图了解如何在hibernate中最好地实现多态一对多。 例如: 现在,我想保留以下类的审核信息: 什么是适当的映射?另外,Hibernate实际上将如何坚持下去呢?将一系列连接的表的生成(,,),或者是有没有更好的办法? 请注意,我宁愿不要让我的其他实体类暴露联接的另一面(例如on ),但是,如果这是最干净的实现方式,那就足够了。 问题答案: 映射的超类不是实体,因此不能成为关联的

  • 问题内容: 我有两个如下的类设置。当我需要注释什么东西作为外国收藏时,我什么时候不需要,我感到困惑。这听起来也很愚蠢,但是文档中没有任何地方说明是否允许非外部集合。如果我有一个自动装箱到的清单,该怎么办?我可以使用上面的标准来坚持吗?根据,外国馆藏还必须具有向后引用才能正常工作(给父母的引用,具有一对多的关系)。对于下面的示例,我假设您应该将注解作为外部集合并进行异化,但是您将如何处理呢? 我在这

  • 我已经开始使用推荐的,并不再使用。其中一件我无法粘合的事情是使用持久的cookie存储。我只想在我的连接上附加一个定制的cookie处理程序/管理器来存储cookie。Android文档并没有太大帮助,因为它将有关cookie的主题概括为两行。 我之前一直在使用LoopJ的PersistentCookieStore,效果很好。 关于如何在Android中设置一个持久的cookie存储,我可以附加到