#java #spring-boot #jpa
#java #spring-boot #jpa
Вопрос:
Как говорит титтл, у меня есть два источника данных в моем приложении, и первый репозиторий работает нормально, но мой второй репозиторий не может сохранить обновление или удалить, только запрос работает хорошо. когда я проверяю консоль, ошибка не появляется. Может ли кто-нибудь помочь?
первая конфигурация репозитория
package com.iisigroup.product.insightplatform.config;
import com.iisigroup.product.insightplatform.repository.jpa.CustomMsgRutLogsRepository;
import com.iisigroup.product.insightplatform.repository.jpa.impl.BaseRepositoryImpl;
import com.iisigroup.product.insightplatform.repository.jpa.impl.MsgRutLogsGeneralRepositoryImpl;
import com.iisigroup.product.insightplatform.repository.jpa.impl.MsgRutLogsOracleRepositoryImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.jpa"
, repositoryBaseClass = BaseRepositoryImpl.class,
transactionManagerRef = "JPATra", entityManagerFactoryRef = "entityManagerFactory1")
public class JPAConfig {
@Autowired
private DataSource dataSource;
@Autowired
private Environment env;
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource);
}
@Primary
@Bean(name = "JPATra")
public PlatformTransactionManager transactionManager1() {
final JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory1());
return txManager;
}
@Bean(name = "entityManagerFactory1")
@Primary
public EntityManagerFactory entityManagerFactory1() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaProperties(hibernateProperties());
em.setJpaVendorAdapter(vendorAdapter);
em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.domain.jpa"});
em.setPersistenceUnitName("emfBW");
em.afterPropertiesSet();
return em.getObject();
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "false");
properties.setProperty("hibernate.max_fetch_depth", "3");
properties.setProperty("hibernate.jdbc.fetch_size", "50");
properties.setProperty("hibernate.jdbc.batch_size",
env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
return properties;
}
}
второй репозиторий
package com.iisigroup.product.insightplatform.config;
import com.iisigroup.product.insightplatform.repository.traffic.BaseRepositoryImpl;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.traffic",
repositoryBaseClass = BaseRepositoryImpl.class,
entityManagerFactoryRef = "trafficentityManagerFactory",
transactionManagerRef = "traffictransactionManager")
public class TrafficJPAConfig {
@Autowired
private Environment env;
@Bean(name = "trafficDatasource")
public HikariDataSource trafficDatasource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("secondUrl");
dataSource.setUsername("secondUser");
dataSource.setPassword("secondPass");
dataSource.setMaximumPoolSize(8);
dataSource.setIdleTimeout(15);
dataSource.setConnectionTimeout(3000);
return dataSource;
}
@Bean
public JdbcTemplate trafficjdbcTemplate() {
return new JdbcTemplate(trafficDatasource());
}
@PersistenceContext(unitName="traffic")
@Bean(name = "traffictransactionManager")
public PlatformTransactionManager traffictransactionManager() {
final JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(productEntityManager().getObject());
return txManager;
}
@PersistenceContext(unitName="traffic")
@Bean(name = "trafficentityManagerFactory")
public EntityManagerFactory trafficentityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(trafficDatasource());
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaProperties(hibernateProperties());
em.setJpaVendorAdapter(vendorAdapter);
em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
em.setPersistenceUnitName("traffic");
em.afterPropertiesSet();
return em.getObject();
}
@Bean
@PersistenceContext(unitName="traffic")
public LocalContainerEntityManagerFactoryBean productEntityManager() {
final LocalContainerEntityManagerFactoryBean em
= new LocalContainerEntityManagerFactoryBean();
em.setDataSource(trafficDatasource());
em.setPackagesToScan(
new String[] {"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(hibernateProperties());
return em;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.max_fetch_depth", "3");
properties.setProperty("hibernate.jdbc.fetch_size", "50");
properties.setProperty("hibernate.jdbc.batch_size",
env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
return properties;
}
}
И я пытаюсь переопределить метод удаления с помощью under code, он отлично работает
@Override
public void delete(String s) {
TrafficJPAConfig cc = new TrafficJPAConfig();
JdbcTemplate temp = cc.trafficjdbcTemplate();
String sql = String.format("delete from UserColumnGrpFieldValueSTB where UUID ='%s' ", s);
temp.execute(sql);
// super.delete(s);
}
Комментарии:
1. Первое, что я подозреваю, это то, что вы проверили, что ваш второй источник данных в изолированной среде (без первого источника данных) может выполнять операции сохранения, удаления? Если ваши сущности находятся в двунаправленных отношениях, обязательно синхронизируйте их перед удалением.
Ответ №1:
после использования второго источника данных в изолированной среде это не имело никакого значения. Но это работает после того, как я изменил свою вторую конфигурацию источника данных, как мой приведенный ниже код, он работает нормально. Я не знаю причину, по которой это работает, и мне любопытно, кто-нибудь знает почему?
@Configuration
//@ComponentScan("com.iisigroup.product.insightplatform.domain.jpa")
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.iisigroup.product.insightplatform.repository.traffic",
repositoryBaseClass = BaseRepositoryImpl.class,
entityManagerFactoryRef = "trafficentityManagerFactory",
transactionManagerRef = "traffictransactionManager")
public class TrafficJPAConfig {
@Autowired
private Environment env;
@Bean(name = "trafficDatasource")
public HikariDataSource trafficDatasource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("secondDatasouce");
dataSource.setUsername("secondDatasouce");
dataSource.setPassword("secondDatasouce");
dataSource.setMaximumPoolSize(8);
dataSource.setIdleTimeout(15);
dataSource.setConnectionTimeout(3000);
return dataSource;
}
@Bean
public JdbcTemplate trafficjdbcTemplate() {
return new JdbcTemplate(trafficDatasource());
}
@PersistenceContext(unitName="traffic")
@Bean(name = "traffictransactionManager")
public PlatformTransactionManager traffictransactionManager() {
final JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(trafficentityManagerFactory());
return txManager;
}
@PersistenceContext(unitName="traffic")
@Bean(name = "trafficentityManagerFactory")
public EntityManagerFactory trafficentityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(trafficDatasource());
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaProperties(hibernateProperties());
em.setJpaVendorAdapter(vendorAdapter);
// em.setEntityManagerFactoryInterface(MultiEntityManagerFactory.class);
em.setPackagesToScan(new String[]{"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
em.setPersistenceUnitName("traffic");
em.afterPropertiesSet();
return em.getObject();
}
// @Bean
// @PersistenceContext(unitName="traffic")
// public LocalContainerEntityManagerFactoryBean productEntityManager() {
// final LocalContainerEntityManagerFactoryBean em
// = new LocalContainerEntityManagerFactoryBean();
// em.setDataSource(trafficDatasource());
// em.setPackagesToScan(
// new String[] {"com.iisigroup.product.insightplatform.repository.traffic","com.iisigroup.product.insightplatform.domain.jpa"});
// JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
//// final HashMap<String, Object> properties = new HashMap<String, Object>();
//// properties.put("hibernate.hbm2ddl.auto", "auto");
//// properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
//// em.setJpaPropertyMap(properties);
// em.setJpaVendorAdapter(vendorAdapter);
// em.setJpaProperties(hibernateProperties());
//
// return em;
// }
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true");
properties.setProperty("hibernate.max_fetch_depth", "3");
properties.setProperty("hibernate.jdbc.fetch_size", "50");
properties.setProperty("hibernate.jdbc.batch_size",
env.getProperty("spring.jpa.properties.hibernate.jdbc.batch_size"));
properties.setProperty("hibernate.enable_lazy_load_no_trans", "true");
return properties;
}
}