【问题标题】:@PrePersist method not working or not been called@PrePersist 方法不起作用或未被调用
【发布时间】: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 方法没有被调用或不起作用。我已经在线阅读了一些ListenersEventHandler 解决方案,但这必须比我认为的要简单得多,因为这本书到目前为止还没有涵盖那些高级主题,无论如何这些解决方案对我也不起作用.

更新

我不认为是“如何在 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


【解决方案1】:

如果使用schema.sql 文件加载数据库,解决方案是删除该文件并让 JPA 基于自动映射创建数据库架构,因为它不能同时执行这两项操作。

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2014-03-04
    • 2020-02-25
    • 2012-10-16
    • 2021-08-12
    • 2012-01-28
    相关资源
    最近更新 更多