当前位置: 首页 > 面试题库 >

@PreUpdate的使用问题

艾子石
2023-03-14
问题内容

我有以下课程:

    @MappedSuperclass
public abstract class MappedModel
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false, unique = true)
    private Long mId;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "rec_created_dtm", nullable = false, updatable = false)
    private Date recordCreatedDTM;

    @Column(name = "rec_cre_user_id", nullable = true, updatable = false)
    private Long recordCreatedUserId;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_update_dtm", nullable = false)
    private Date lastUpdateDTM;

    @Column(name = "last_update_user_id", nullable = true)
    private Long lastUpdateUserId;

//  @PrePersist
//  protected void onCreate()
//  {
//      this.lastUpdateDTM = this.recordCreatedDTM = new Date();
//  }
//
//  @PreUpdate
//  protected void onUpdate()
//  {
//      lastUpdateDTM = new Date();
//  }

  @PrePersist
  @PreUpdate
  protected void updateDates() {
    if (this.recordCreatedDTM == null) {
        this.recordCreatedDTM = new Date();
    }
    lastUpdateDTM = new Date();
  }

我的所有实体类都使用该类。

所以我有以下课程

@Entity
@Table(name="customer")
public class Customer extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -2543425088717298236L;


    @OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="address_id",nullable=true,updatable=true,insertable=true)
    private Address mAddress;

@Entity
@Table(name="address")
public class Address  extends MappedModel implements Serializable
{

    /**
   * 
   */
  private static final long serialVersionUID = -3505413538055124608L;

  @Column(name="address_line_1", length=150, nullable=false)
  private String mAddressLine;

  @Column(name="city", length=150, nullable=false)
  private String mCity;

  @Column(name="state", length=2, nullable=true)
  private String mState;

  @Column(name="postal_code", length=10, nullable=false)
  private String mPostalCode;

因此,当我创建一个新客户时,出现以下错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

我在这里做错了。


问题答案:

至少在使用JPA 的API 时,PrePersistand
PreUpdate回调确实在MappedSuperclass…中工作EntityManager,这在您的情况下还不清楚。

您在使用EntityManager还是SessionAPI?在后一种情况下,使用注解的方法PrePersistPreUpdate从JPA注释将不会被调用(和我的建议是使用监听器或拦截器)。



 类似资料:
  • 问题内容: 我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用,并在照顾使用Hibernate实现JPA与会议现场(INSERT和UPDATE)。 原因? :需要进行此更改,因为有必要使用,而且我知道(因为我之前已经遇到过),liquibase使用默认的current_timestamp将时间戳转换为datetime,对于MySQL数据库来说太糟糕了。 所以我需要一

  • 问题内容: 我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用,并在照顾使用Hibernate实现JPA与会议现场(INSERT和UPDATE)。 原因? :需要进行此更改,因为有必要使用,而且我知道(因为我之前已经面对过),liquibase使用默认的current_timestamp将时间戳转换为日期时间,这对于mysql数据库来说太糟糕了。 所以我需要一种在代

  • 假设以下代码段使用@PrePersist和@PreUpdate注释并连接了类型继承: 问题:我们可以依赖回调方法的任何执行顺序吗? 例如,当持久化类A和B时,B中的prePersist方法会在A中的prePersist方法之前执行还是在A中的prePersist方法之前执行? 我们可以假设B中的prePersist将在类A被持久化之前执行吗?

  • 问题内容: 我在StackOverflow上遇到了类似的问题,尝试了解决方案,但没有找到答案。 我正在使用一种相当通用的JPA策略来设置某些实体的上次修改时间。设置列和字段,然后使用标记方法,并将其设置为等于当前时间。 问题是,我可以在调试器中看到正在调用该方法并且该字段正在更新,但是在我的数据库日志中,我仅看到一个SQL调用,以UPDATE更改字段,其中不包含timestamp字段的UPDATE

  • 我有一个实体: 而听众: 我正在使用为这个实体(1.4.1)和EclipseLink生成的Spring Data。代码行为如下所示: 这个问题在2009年已经有人描述过了,但是他们没有提出任何解决方案。不知道有没有人有办法解决?

  • 我有一个带有方法的model类,它用@preupdate进行了注释。此方法调用我的方法: 我的实现: