【发布时间】:2020-01-01 04:26:33
【问题描述】:
最近我读了《Spring in Action 5th》这本书,因为我需要一个重要课程作业的框架,但我一直卡在一个章节的末尾,无法继续。我认为这里的问题是名为“createdAt()”的方法(您可能想象的任务是在持久化之前设置对象的相同调用属性),在休眠持久化之前没有调用带有@PrePersist 注释的方法对象,因此数据库将其设为 null 并引发错误。
如前所述,这是一个 Spring Boot 项目,使用带有嵌入式 h2 数据库的 spring-boot-starter-web hibernate。
该项目非常简单,它只有一个包含成分对象的 Taco 类。控制器应该接收“名称”和“成分”属性,并且确实如此。问题只是在尝试将 Taco taco 对象持久保存在数据库中时。我正在向您发布一些代码,抱歉没有突出显示。
springboot version: 2.1.4.RELEASE
com.h2database version: 1.4.196
实体:
//The entity
@Data
@Entity
public class Taco {
@Id
@GenerateValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String name
@ManyToMany(targetEntity=Ingredient.class)
private List<Ingredient> ingredients
//then
private Date createdAt;
@PrePersist
void createdAt(){
this.createdAt = new Date();
}
}
//The controller
@Slf4j
@Controller
@Requestmapping("/design")
@SessionAtributes("order")
public class DesignTacoController{
//regular repository stuff and model attributes
@PostMapping
public String processDesign(@Valid Taco taco, @Model Attribute Order order, Errors errors){
//if error return to the view
Taco saved = tacoRepo.save(taco);
}
}
这个例子非常简单,几乎可以从代码中得到什么期望,它只需要保存 Taco 对象。就在执行 save() 之前,设置了“name”属性。当 save() 方法被执行时,它会抛出这个众所周知的异常:
未找到序列“HIBERNATE_SEQUENCE”; SQL 语句:调用 hibernate_secuence[90036-196] 的下一个值
有人告诉我将生成价值策略从 @GeneratedValue (strategy = GenerationType.AUTO) 更改为 @GeneratedValue ( strategy = GenerationType.IDENTIFY)。这样做时,它会停止找不到序列,而是会引发另一个错误:
未找到列“CREATED_AT”; SQL 语句:插入 taco(id,created_at,name) 值 (null,?,?) [42122-196]
这让我觉得序列问题已经消失了,但是现在 @PrePersisted 方法没有被调用或不起作用。我已经在线阅读了一些Listeners 和EventHandler 解决方案,但这必须比我认为的要简单得多,因为这本书到目前为止还没有涵盖那些高级主题,无论如何这些解决方案对我也不起作用.
更新
我不认为是“如何在 jpa 持久性 xml 文件中自动创建表”的重复,因为它指的是 Spring 的持久性 xml 文件,我正在使用 spring boot,到目前为止还没有这样的文件项目中,缺少的 @Table 注释也不是解决方案,jpa 属性值也不是,因为给出的错误也不相同。
【问题讨论】:
-
将
@JsonIgnore放在 createdAt 字段上。这个问题是因为 hibernate 试图持久化它。 -
您好@Jonathan Johx,感谢您的评论。我只是这样做了,但仍然抛出“未找到 HIBERNATE_SEQUENCE”错误。
-
Hibernate 不是在抱怨空的
createdAt,而是在抱怨缺少列。如果您希望 Hibernate 创建表和序列,请参阅 stackoverflow.com/questions/32873844/… 。然后你可以切换回GenerationType.AUTO,因为丢失的序列也会被创建。 -
感谢@Tobias Liefke 的评论,因为我在这似乎不是我的情况之前进行了编辑。
标签: hibernate spring-boot spring-mvc spring-data-jpa persistence