我有一个场景,我想为同一个实体类创建多个存储库。 第一个也是最简单的场景我想将我的类的一些实例保存为不同于主表(在实体本身指定)的表中的行。其他场景将创建远程备份,因此整个数据源将会不同。 春天是否允许这样的事情?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