14

给定以下类:

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="animalType",discriminatorType=DiscriminatorType.STRING)
@QueryExclude
public abstract class Animal  {}

@Entity
@DiscriminatorValue("dog")
public class Dog {}

@Entity
@DiscriminatorValue("cat")
public class Cat {}

是否有可能以某种方式配置 JPA 存储库Animal

我试过了

public interface AnimalRepository extends JpaRepository<Animal,Long>

然而,这失败了:

java.lang.IllegalArgumentException:不是托管类型:动物

有没有办法配置这个?

我希望能够执行以下任务:

@Autowired
private AnimalRepository repository;

public void doSomething()
{
    Animal animal = repository.findById(123);
    animal.speak();
}
4

4 回答 4

10

我有类似的错误。我通过将我的实体类的映射添加到我的 persistence.xml 文件来解决它。

所以也许在你的persistence.xml中添加这样的东西:

<persistence-unit>
...   
<class>yourpackage.Animal</class>
...
</persistence-unit>
于 2012-07-25T07:12:09.710 回答
6

我遇到了这个确切的问题,我找到了解决方案:您需要使用@MappedSuperclass OR @Inheritance,而不是同时使用。像这样注释你的Animal类:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal  {}

底层数据库方案将保持不变,现在您的泛型AnimalRepository应该可以工作了。持久性提供者将进行自省并找出将哪个表用于实际子类型。

于 2013-01-15T19:42:02.457 回答
2

我猜您正在运行 Hibernate 作为您的持久性提供程序,对吧?我偶然发现了这种与 Hibernate 的场景有关的问题,因为针对 Hibernate 元模型的类型查找与 JPA 中指定的内容不一致(请参阅此错误了解详细信息)。因此,您似乎有两个选择:

  1. 将抽象超类也更改@Entity
  2. 切换到不同的持久提供程序
于 2012-03-29T17:31:45.440 回答
0

您需要在 webconfig 中的 @EntityScan 中包含 Animal-class

于 2016-04-22T11:12:19.067 回答