【问题标题】:Spring Data JPA : Creating an abstract repositorySpring Data JPA:创建抽象存储库
【发布时间】:2012-04-12 01:18:24
【问题描述】:

给定以下类:

@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:不是托管类型:动物

有没有办法配置这个?

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

@Autowired
private AnimalRepository repository;

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

【问题讨论】:

    标签: java spring spring-data spring-data-jpa


    【解决方案1】:

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

    所以也许可以在你的 persistence.xml 中添加这样的内容:

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

    【讨论】:

    • +1 帮助我解决了与发布的问题类似的问题.. 感谢您的提醒..
    【解决方案2】:

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

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

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

    【讨论】:

    • 迄今为止唯一明智的答案。 JPA 注释是错误的。除了您所说的之外,如果每个班级都有一个表格,为什么还需要一个鉴别器列?没有意义。
    【解决方案3】:

    我猜您正在运行 Hibernate 作为您的持久性提供程序,对吧?我偶然发现了 Hibernate 的这种情况的问题,因为针对 Hibernate 元模型的类型查找与 JPA 中指定的内容不一致(参见 bug for details)。所以看起来你有两个选择:

    1. 将抽象超类也更改为@Entity
    2. 切换到其他持久提供程序

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 2018-08-06
        • 2016-12-26
        相关资源
        最近更新 更多