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
希望详细信息对您有所帮助:)
当我尝试保存映射实体时,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
希望详细信息对您有所帮助:)