JpaRepository插入无效[Spring Boot + MySQL]

时间:2019-06-16 17:29:45

标签: java mysql spring spring-boot

首先,我必须声明我在项目中启用了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批注,而关于其他两个数据库的其他两个配置则没有。

1 个答案:

答案 0 :(得分:1)

确保您正在使用@Repository 像下面这样在存储库顶部的@Transactional注释。

@Repository
@Transactional
public interface Db1LogRepository extends JpaRepository<Log,Long>