2017-07-19 70 views
1

我有大約30個需要從XML文件填充的表。我想用JPA來達到這個目的。Spring動態JPA存儲庫類型

現在我有30個類註解@Entity,掃描實體和存儲庫的配置;

我也有:

@Repository 
public interface MyRepository extends JpaRepository<MyEntity1, Long> { 
} 

和(某些控制器):

@Autowired 
public MyRepository myRepository; 
... 
... 
MyEntity1 entity = new MyEntity(...); 
myRepository.save(entity); 

它正常工作與一個@Entity但我應該定義30個庫是什麼?

我想我可以做這樣的事情:

@Repository 
public interface MyRepository<T> extends JpaRepository<T, Long> { 
} 

然後:

@Autowired 
public MyRepository<MyEntity1> myRepository1; 
@Autowired 
public MyRepository<MyEntity2> myRepository2; 

但給了一個錯誤:據

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myRepository1': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object 
+0

不要忘了接受/給予好評的答案,幫助你... – Cepr0

回答

1

,因爲我知道發生了什麼你正在嘗試是不可能的。 Spring Data JPA需要爲其存儲庫提供每個實體類型的接口,因爲Spring Data JPA將創建query implementations

因此,建議您有一個每個實體的存儲庫,因爲它將允許您在將來也可以添加複雜的findByXXX方法。

+0

謝謝你,我會得到很多複製粘貼的工作;) – Daria

2

不幸的是,你不能這樣做,你將不得不編寫30個獨立的存儲庫。但是,當實體共享單個表繼承時,您可以編寫通用存儲庫。 (請參閱Using generics in Spring Data JPA repositories的答案)

你的代碼試圖做的是創建一個存儲庫,其中共享繼承位於類Object而不是@Entity因此是例外。

此外還有一點小問題,您不需要使用@Repository註釋您的存儲庫。如果配置正確,Spring數據會自動將它們註冊爲Bean。

+0

謝謝。當我嘗試修復我無法自動裝入存儲庫時,我添加了@Repository註解,但是錯誤是我用拼寫錯誤的軟件包將repos複製到了scan =)。無論如何,你清除了我的想法,謝謝) – Daria

2

試試這個辦法:

基類的所有實體

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

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    private Long id; 
} 

實體

@Entity 
public class Entity1 extends BaseEntity { 

    private String name; 
} 

@Entity 
public class Entity2 extends BaseEntity { 

    private String name; 
} 

常見的回購

public interface BaseEntityRepo extends JpaRepository<BaseEntity, Long> { 
} 

使用

public class BaseEntityRepoTest extends BaseTest { 

    @Autowired 
    private BaseEntityRepo repo; 

    @Test 
    public void baseEntityTest() throws Exception { 

     BaseEntity entity1 = new Entity1("entity1"); 
     BaseEntity entity2 = new Entity2("entity2"); 

     repo.save(entity1); 
     repo.save(entity2); 

     List<BaseEntity> entities = repo.findAll(); 
     assertThat(entities).hasSize(2); 

     entities.forEach(System.out::println); 
    } 
}