2016-11-04 85 views
0

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

+0

我写了一个类似的问题的答案(除了它是为spring-data-mongo):http://stackoverflow.com/questions/38337453/customizing-spring-data-repository-bean-names-for-use-with-multiple-data-sources – alexbt

+0

做了链接帮帮我 ?你还在寻找答案吗? – alexbt

+0

我还没有尝试过 - 我正在修复系统中的其他一些问题。今天晚上我会尽力回复它。谢谢 – Charbel

回答

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

相关问题