Java @PreUpdate的使用问题
我有以下课程:Java @PreUpdate的使用问题,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,我有以下课程: @MappedSuperclass public abstract class MappedModel { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id", nullable = false, unique = true) private Long mId; @Temporal(TemporalType.TIMESTAMP) @
@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;
及
因此,当我创建新客户时,会出现以下错误:
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)
我做错了什么 PrePersist和
PreUpdate
回调在MappedSuperclass
中工作。。。至少在使用JPA提供的EntityManager
API时是这样,这在您的案例中并不清楚
您使用的是
EntityManager
还是会话
API?在后一种情况下,使用JPA的PrePersist
,PreUpdate
注释进行注释的方法将不会被调用(我的建议是使用)。请提供异常的完整堆栈跟踪。我认为您对PreUpdate
或PrePersist
没有问题。消息not null属性引用了一个null或暂时值:vsg.ecotrak.dataaccess.domain.Address.lastUpdateDTM
表示lastUpdateDTM
为null
,并且可能在触发任何@Pre…
方法之前休眠失败。使用会话-不使用有意义的JPAwell-猜我错过了在文档中-谢谢,实际上,我们可以使用JPA回调和Hibernate会话:
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)