Spring Boot存储库保存不起作用(仅显示选择)

时间:2017-08-25 21:50:48

标签: spring-boot insert spring-data-jpa composite-key

在尝试保存映射实体时,我在Spring Boot中遇到了一个奇怪的过程几个小时。

具有必须由用户设置的复合键的实体类如下:

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。我试图不通知对象中的复合键,然后save方法由于主键中的空值而导致INSERT出错。

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

我已经在服务类中尝试使用@Transactional并且无法正常工作。我没有在项目中进行任何事务配置,因为Spring Boot默认提供它。

感谢。

2 个答案:

答案 0 :(得分:1)

您似乎使用MyIdClass作为MyClass的ID。因此,存储库应该是:

interface MyRepository extends CrudRepository<MyClass, MyIdClass>{
}

希望得到这个帮助。

答案 1 :(得分:1)

我拿了你的代码示例并在示例Spring Boot项目上尝试了它,在那里我能够使用@Embeddable&amp;存储到H2 DB(内存中)。 @EmbeddedId注释。如果要验证,可以克隆GitHub存储库并将BootJpaApplication.java作为Java应用程序运行。 执行后,使用本地的以下链接访问H2控制台,可以验证表格详细信息。

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

希望细节有所帮助:)