我有一個場景,我想爲同一個實體類創建多個存儲庫。 第一個也是最簡單的場景我想將我的類的一些實例保存爲不同於主表(在實體本身指定)的表中的行。其他場景將創建遠程備份,因此整個數據源將會不同。 春天是否允許這樣的事情?Spring JPA在存儲庫接口上指定實體的表名
0
A
回答
0
我不知道你會想這一點,但在這裏它是無論如何...我能找到使用Spring的數據存儲庫的最好的是以下幾點:
(1A)手動定義2種庫豆使用2個數據源:
@Bean
@Qualifier("db1")
public ModelJpaRepository modelJpaRepositoryDb1() {
JpaRepositoryFactoryBean<ModelJpaRepository, Model, String> myFactory = new JpaRepositoryFactoryBean<ModelJpaRepository, Model, String>();
myFactory.setRepositoryInterface(ModelJpaRepository.class);
myFactory.setEntityManager(entityManagerFactory1().createEntityManager());
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
@Bean
@Qualifier("db2")
public ModelJpaRepository modelJpaRepositoryDb2() {
JpaRepositoryFactoryBean<ModelJpaRepository, Model, String> myFactory = new JpaRepositoryFactoryBean<ModelJpaRepository, Model, String>();
myFactory.setRepositoryInterface(ModelJpaRepository.class);
myFactory.setEntityManager(entityManagerFactory2().createEntityManager());
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
(1B):定義數據源2(由先前的儲存庫的定義簡稱):
@Bean(name = "dataSource1")
public DataSource dataSource1() {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName(...);
bds.setUrl(...);
bds.setUsername(...);
bds.setPassword(...);
return bds;
}
@Bean(name = "dataSource2")
public DataSource dataSource2() {
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName(...);
bds.setUrl(...);
bds.setUsername(...);
bds.setPassword(...);
return bds;
}
(1C):定義2個entityManagers - 1每數據源(由先前的儲存庫的定義簡稱):
@Bean
public EntityManagerFactory entityManagerFactory1() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource1());
entityManagerFactory.setPersistenceUnitName("pu1");
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter());
entityManagerFactory.setJpaProperties(jpaProperties());
entityManagerFactory.afterPropertiesSet();
return entityManagerFactory.getNativeEntityManagerFactory();
}
@Bean
public EntityManagerFactory entityManagerFactory2() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource2());
entityManagerFactory.setPersistenceUnitName("pu2");
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter());
entityManagerFactory.setJpaProperties(jpaProperties());
entityManagerFactory.afterPropertiesSet();
return entityManagerFactory.getNativeEntityManagerFactory();
}
(2)注入2個庫和使用它們:
@Autowired
@Qualifier("db1")
private ModelJpaRepository modelJpaRepositoryDb1;
@Autowired
@Qualifier("db2")
private ModelJpaRepository modelJpaRepositoryDb2;
...
modelJpaRepositoryDb1.save(model);
modelJpaRepositoryDb2.save(model);
(3)定義 「OtherModel」 和包括 「模型」 作爲嵌入:
@Entity
@Table(name = "OTHER_TABLE")
public class OtherTable {
@Id
@Column(name = "ID", nullable = false)
private long id;
@Embedded
private Model model;
public OtherTable(Model model) {
this.model = model;
this.id = model.getId();
}
}
有關信息,This answer建議使用@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
來實現定義一個附加模型(繼承vs組合)。
(4)定義的2個庫的OtherTable:
@Bean
@Qualifier("db1")
public OtherTableJpaRepository otherTableJpaRepositoryDb1() {
JpaRepositoryFactoryBean<OtherTableJpaRepository, OtherTable, String> myFactory = new JpaRepositoryFactoryBean<OtherTableJpaRepository, OtherTable, String>();
myFactory.setRepositoryInterface(OtherTableJpaRepository.class);
myFactory.setEntityManager(entityManagerFactory1().createEntityManager());
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
@Bean
@Qualifier("db2")
public OtherTableJpaRepository otherTableJpaRepositoryDb2() {
JpaRepositoryFactoryBean<OtherTableJpaRepository, OtherTable, String> myFactory = new JpaRepositoryFactoryBean<OtherTableJpaRepository, OtherTable, String>();
myFactory.setRepositoryInterface(OtherTableJpaRepository.class);
myFactory.setEntityManager(entityManagerFactory2().createEntityManager());
myFactory.afterPropertiesSet();
return myFactory.getObject();
}
(5)注入,並使用它們:
@Autowired
@Qualifier("db1")
private ModelJpaRepository modelJpaRepositoryDb1;
@Autowired
@Qualifier("db2")
private ModelJpaRepository modelJpaRepositoryDb2;
@Autowired
@Qualifier("db1")
private OtherTableJpaRepository otherTableJpaRepositoryDb1;
@Autowired
@Qualifier("db2")
private OtherTableJpaRepository otherTableJpaRepositoryDb2;
// ...
modelJpaRepositoryDb1.save(model);
otherTableJpaRepositoryDb1.save(new OtherTable(model));
modelJpaRepositoryDb2.save(model);
otherTableJpaRepositoryDb2.save(new OtherTable(model));
+0
好的,謝謝你,我會在此一展身手。我必須說,我認爲應該是一個正常的功能似乎是非常複雜的。我想知道人們將如何實現一種歷史數據值,這是一種以前版本的日誌。我不知道。無論如何,非常感謝。我會告訴你。 – Charbel
相關問題
- 1. Spring JPA不存儲實體
- 2. Spring JPA將實體存儲在實體內
- 3. 在Spring JPA中擴展接口以創建存儲庫的想法是什麼?
- 4. JPA存儲庫:在大表中保存實體的問題 - 超時錯誤
- 5. 如何在Spring-Data-JPA的自定義實現存儲庫中使用我的基本存儲庫方法?
- 6. 具有多個實體查找器的常見spring jpa存儲庫
- 7. spring JPA逐步保存實體
- 8. Spring動態JPA存儲庫類型
- 9. Spring Data JPA返回null存儲庫
- 10. Spring JPA存儲庫事務性
- 11. 在Spring Boot/Hibernate/JPA中爲連接表指定表和字段名稱
- 12. 定製實現存儲庫Spring-Data-Cassandra
- 13. Spring rest + JPA + H2 @ManyToOne雙向關係。無法存儲子實體
- 14. 在spring-data-jpa中實現自定義行爲到存儲庫方法
- 15. 嵌套對象未保存JPA,Spring JPA存儲庫Oracle
- 16. 在spring數據jpa中實現JpaRepository接口的存儲庫能否返回排序集?
- 17. 從JPA實體接口獲取@NamedQuery
- 18. 獲取實體類的JPA和倉庫接口
- 19. JPA實體未存儲OneToMany關係
- 20. 春季啓動JPA:存儲實體JSON
- 21. 使用JPA CRUD存儲庫查找兒童實體的數量
- 22. 在Azure表存儲中存儲實體指針(外鍵)的最佳實踐
- 23. 原則:自定義實體存儲庫
- 24. 如何在Spring Data JPA中從cusom存儲庫訪問主存儲庫?
- 25. 在Spring中單獨的JPA實體中計算和存儲總數
- 26. JPA Hibernate Spring存儲庫確保事務在保存時完成?
- 27. Spring Boot JPA無法添加自定義存儲庫
- 28. 如何僅使用spring jpa存儲庫更新特定字段?
- 29. CDI + JPA存儲庫
- 30. 在實體框架中存儲基於接口的關係
我寫了一個類似的問題的答案(除了它是爲spring-data-mongo):http://stackoverflow.com/questions/38337453/customizing-spring-data-repository-bean-names-for-use-with-multiple-data-sources – alexbt
做了鏈接幫幫我 ?你還在尋找答案嗎? – alexbt
我還沒有嘗試過 - 我正在修復系統中的其他一些問題。今天晚上我會盡力回覆它。謝謝 – Charbel