首先,我必须声明我在项目中启用了3个数据库。
关于插入数据库的任何方法似乎都不适用,但是select方法适用。这是很奇怪的事情,不是Spring Boot不能确定要使用哪个数据库,因为同一存储库是从正确的数据库中选择但不能插入的。此外,在Java环境和MySQL中都没有错误(我在application.properties
上启用了调试选项)
总而言之,save
方法不会插入数据库,但是选择相同的存储库不会有任何问题。我检查了我是否具有插入数据库的特权,然后这样做(以防万一,我也再次添加了它们)。
我正在为选择和插入使用相同的实体。
我要访问的表名为log
,数据库名为db1
。此外,插入还可以在db3
上进行。
我还为所有三个数据库配置了DataSource
。
我想补充一点,三个数据库上有多个具有相同名称的表。由于其他原因,我无法给您确切的命名,但是我会尝试任何有关命名的建议。但是我不得不说,在所有三个数据库上的选择完全按照需要进行。
application.properties
server.port=8086
db1.datasource.test-on-borrow=true
db1.datasource.validation-query=SELECT 1
db2.datasource.test-on-borrow=true
db2.datasource.validation-query=SELECT 1
db3.datasource.test-on-borrow=true
db3.datasource.validation-query=SELECT 1
spring.jpa.hibernate.ddl-auto=validate
jwt.header=Authorization
jwt.secret= //mysecret
jwt.expiration=14400
jwt.route.authentication.path=/login
jwt.route.authentication.refresh=/refresh
spring.profiles.active=prod
webapp.cors.allowedOrigins= //list of allowed origins
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
application-prod.properties
server.port=8086
db1.datasource.url= //db1 url
db1.datasource.username= //username
db1.datasource.password= //password
db1.datasource.driverClassName=com.mysql.jdbc.Driver
db1.datasource.test-on-borrow=true
db1.datasource.validation-query=SELECT 1
db2.datasource.url= //db2 url
db2.datasource.username= //username
db2.datasource.password= //password
db2.datasource.driverClassName=com.mysql.jdbc.Driver
db2.datasource.test-on-borrow=true
db2.datasource.validation-query=SELECT 1
db3.datasource.url= //db3 url
db3.datasource.username= //username
db3.datasource.password= //password
db3.datasource.driverClassName=com.mysql.jdbc.Driver
db3.datasource.test-on-borrow=true
db3.datasource.validation-query=SELECT 1
Log
JPA实体,log
是数据库db1
中表的名称
@Entity
@Table(name = "log" , catalog = "db1")
public class Log implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long logID;
private Integer uploadSeq;
private String date;
public Log() {
}
public Log(Integer uploadSeq, String date) {
this.uploadSeq = uploadSeq;
this.date = date;
}
@Column(name = "logID", unique = true, nullable = false)
public Long getLogID() {
return logID;
}
public void setLogID(Long logID) {
this.logID = logID;
}
@Column(name = "uploadSeq", nullable = false)
public Integer getUploadSeq() {
return uploadSeq;
}
public void UploadSeq(Integer uploadSeq) {
this.uploadSeq = uploadSeq;
}
@Column(name = "date", nullable = false)
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
Db1LogRepository
表的log
存储库
public interface Db1LogRepository extends JpaRepository<Log,Long> {
public Log findFirstByOrderByLogIDDesc(); //is being used on another part of the project
}
Db1LogComponent
组件,用于访问存储库
@Component
public class Db1LogComponent {
@Autowired
Db1logRepository db1LogRepository;
public void addDate(Log log) {
System.out.println(db1LogRepository.findAll().size()); //Retrieves the correct entities of the table log in db1
db1LogRepository.save(log); //Doesn't save to the database
}
}
编辑:DB3在配置文件上具有@Primary
批注,而关于其他两个数据库的其他两个配置则没有。
答案 0 :(得分:1)
确保您正在使用@Repository 像下面这样在存储库顶部的@Transactional注释。
@Repository
@Transactional
public interface Db1LogRepository extends JpaRepository<Log,Long>