在尝试保存映射实体时,我在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默认提供它。
感谢。
答案 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 https://github.com/sujittripathy/springboot-sample.git
希望细节有所帮助:)