2016-11-04 86 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

相關問題