Spring 引导存储库保存不起作用(只显示一个select)

Spring Boot repository save does not work (only shows a select)

当我尝试保存映射实体时,Spring 启动时我遇到了一个奇怪的过程。

复合键必须全部由用户设置的实体class如下:

package model

import javax.persistence.*

@Entity
@Table(name = 'MY_TABLE')
@IdClass(MyIdClass.class)
class MyClass implements Serializable{

    @Id
    @Column(name = "MY_COLUMN_1")
    Long column1

    @Id
    @Column(name = "MY_COLUMN_2")
    Long column2

    @Id
    @Column(name = "MY_COLUMN_3")
    String column3

    @Id
    @Column(name = "MY_COLUMN_4")
    Date date1

    @Column(name = "MY_COLUMN_5")
    Date date2

    @Column(name = "MY_COLUMN_6")
    BigDecimal column6
}

@Embeddable
class MyIdClass implements Serializable{
    Long column1
    Long column2
    String column3
    Date date1;
}

对应的仓库是:

package repository

import org.springframework.data.repository.CrudRepository

interface MyRepository extends CrudRepository<MyClass, Long>{
}

我的服务是:

package service

import model.MyClass
import repository.MyRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

@Service
class MyService {

    @Autowired
    MyRepository repository

    void save(MyClass myClass) {
        repository.save(myClass)
    }
}

我的控制器安装了一个包含所有数据集的 MyClass 对象,包括复合键。当它调用服务保存方法时,对象没有插入到数据库中。我查看了日志并检查了 MY_TABLE 中有一个 SELECT 而不是 INSERT。我试着不通知对象中的复合键,然后保存方法执行了一个 INSERT,但由于主键中的空值而出错。

真不明白为什么组合键有值的时候不插入。我该如何解决?

我已经在服务中尝试使用@Transactional class 但没有成功。我没有在项目中进行任何事务配置,因为 Spring Boot 默认提供它。

谢谢。

您似乎正在使用 MyIdClass 作为 MyClass 的 ID。所以,存储库应该是:

interface MyRepository extends CrudRepository<MyClass, MyIdClass>{
}

希望对您有所帮助。

我使用了你的代码示例并在示例 Spring 启动项目上进行了尝试,我可以在其中使用 @Embeddable@EmbeddedId 注释保存到 H2 DB(内存中) .如果您想验证,您可以克隆 GitHub 存储库和 运行 BootJpaApplication.java 作为 Java 应用程序。 执行后从本地使用以下 link 访问 H2 控制台,其中可以验证 table 详细信息。

http://localhost:8080/h2-console https://github.com/sujittripathy/springboot-sample.git

希望详细信息对您有所帮助:)