簡體   English   中英

Spring Data JPA:創建抽象存儲庫

[英]Spring Data JPA : Creating an abstract repository

給定以下類別:

@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:非托管類型:Animal

有沒有一種配置方式?

我希望能夠執行以下任務:

@Autowired
private AnimalRepository repository;

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

我有類似的錯誤。 我通過將實體類的映射添加到我的persistence.xml文件中來解決了這一問題。

因此,也許在您的persistence.xml中添加以下內容:

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

我遇到了這個確切的問題,我找到了解決方案:您需要使用@MappedSuperclass @Inheritance ,而不能同時使用。 像這樣注釋Animal類:

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

基礎數據庫方案將保持不變,現在您的通用AnimalRepository應該可以使用了。 持久性提供程序將進行自省,並找出用於實際子類型的表。

我猜您正在將Hibernate作為持久性提供程序運行,對嗎? 我偶然發現了Hibernate的這種情況下的問題,因為針對Hibernate元模型的類型查找的行為與JPA中指定的行為不正確( 有關詳細信息,請參見此bug )。 因此,這里似乎有兩個選擇:

  1. 也將抽象超類也更改為@Entity
  2. 切換到其他持久性提供程序

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

Tente desta maneira:

public interface RepositorioAnimal extends JpaRepository<Animal, Long> {

}

@Repository
@Transactional( readOnly = true )
public class RepositorioAnimal extends QueryDslJpaRepository<Animal, Long> implements RepositorioAnimal {

    @Inject
    public RepositorioAnimal( EntityManager em ) {
        super( new JpaMetamodelEntityInformation<Animal, Long>( Animal.class, em.getMetamodel() ), em );
    }

}

public interface ServicoAnimal {

    void salvar( Animal entidade );

    void remover( Animal entidade );

    Animal carregar( Long id );

}

@Service
@Component
public class ServicoAnimalImpl implements ServicoAnimal {

    @Inject
    private RepositorioAnimal animal;

    @Override
    public void salvar( Animal entidade ) {
        animal.save( entidade );
    }

    @Override
    public void remover( Animal entidade ) {
        animal.delete( entidade );
    }

    @Override
    public Animal carregar( Long id ) {
        return animal.findOne( id );
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM