Spring Data JPA:创建抽象仓库

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 {}

有没有办法为Animal配置JPA仓库?

我尝试过了。

public interface AnimalRepository extends JpaRepository<Animal,Long>

但是这会出现以下错误:

java.lang.IllegalArgumentException: Not an managed type: Animal

有没有一种方法可以进行配置?

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

@Autowired
private AnimalRepository repository;

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

10

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

因此,您可以像这样向persistence.xml添加一些内容:

<persistence-unit>
...   
<class>yourpackage.Animal</class>
...
</persistence-unit>

2
+1 帮助我解决了类似于发布的问题.. 感谢提醒.. - raksja

6

我曾经遇到了这个问题,后来找到了解决方法:你要么使用@MappedSuperclass,要么使用@Inheritance,但不能同时使用。请按照以下方式对Animal类进行注释:

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

底层数据库模式将保持不变,现在您的通用AnimalRepository应该可以工作了。持久性提供程序将进行内省,并找出哪个表格用于实际子类型。


5
到目前为止,这是唯一合理的答案。JPA注释是错误的。除了你所说的之外,如果按类表格进行操作,为什么还需要区分列呢?毫无意义。 - Marcel Stör

2

0
你需要在你的webconfig中的@EntityScan中包含Animal类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接