spring 多对多映射的数据 jpa 审计失败
spring data jpa auditing failure for many to many mapping
嗨,由于审计问题,我很难保存其中一个 manytomany 映射实体。
我们使用 spring 数据和基础实体来管理审计信息。
一切正常,但对于一个多对多映射,我得到 sql 异常
字段 'createdon' 没有默认值。
请在下面找到我的配置
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import com.minda.iconnect.cache.CacheableEntity;
/**
* Simple JavaBean domain object with an id property. Used as a base class for objects needing this property.
*
*/
@SuppressWarnings("serial")
@MappedSuperclass
public class BaseEntity implements TimeStampedAuditable, Serializable, CacheableEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "createdon", nullable = false)
protected Date createdOn;
@Column(name = "updatedon")
protected Date updatedOn;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public boolean isNew() {
return (this.id == null);
}
@Override
public Date getCreatedOn() {
return createdOn;
}
@Override
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
@Override
public Date getUpdatedOn() {
return updatedOn;
}
@Override
public void setUpdatedOn(Date updatedOn) {
this.updatedOn = updatedOn;
}
@Override
public String getCacheKey() {
return getId() == null ? "null" : String.valueOf(getId());
}
}
下面提到 sql 用于 table 创建:
create table role (
id bigint primary key not null auto_increment,
name varchar(255) not null,
role_code varchar(31) not null,
createdon datetime not null,
updatedon datetime
) engine=innodb;
create table user (
id bigint primary key not null auto_increment,
username varchar(255),
firstname varchar(255) not null,
lastname varchar(255) not null,
email varchar(255) not null,
createdon datetime not null,
updatedon datetime
) engine=innodb;
create table user_role (
id bigint primary key not null auto_increment,
roles_id bigint not null references role(id),
user_id bigint not null references user(id),
createdon datetime not null,
updatedon datetime
) engine=innodb;
我正在使用以下代码来保存具有现有角色的用户:
@Transactional
@Override
public User createUser(User user) {
Role role = roleService.getRoleByCode("Some Role");
List<Role> roles = new ArrayList<Role>();
roles.add(role);
user.setRoles(roles);
User savedUser = userRepository.save(user);
}
保存时出现 sql 错误,提示 createdon 字段没有默认值。
由于该关系是由 jpa 自行管理的实体,我很困惑需要做什么才能使其可审计。
谢谢,
罗希特·米什拉
由于 nullable = false
,您会收到该异常,您可以使用 Jpa Entity Listener,
@PrePersist
protected void persistCreatedOn(){
this.createdOn = Calendar.getInstance().getTime();
}
这样 JPA 将在持久化您的实体之前设置 createdOn
。
分析问题并花了一些时间后,我们意识到关系不应该扩展基础实体,它们不需要被审计,父实体提供了所需的信息。处理关系是底层 or 的工作。
嗨,由于审计问题,我很难保存其中一个 manytomany 映射实体。
我们使用 spring 数据和基础实体来管理审计信息。 一切正常,但对于一个多对多映射,我得到 sql 异常 字段 'createdon' 没有默认值。
请在下面找到我的配置
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import com.minda.iconnect.cache.CacheableEntity;
/**
* Simple JavaBean domain object with an id property. Used as a base class for objects needing this property.
*
*/
@SuppressWarnings("serial")
@MappedSuperclass
public class BaseEntity implements TimeStampedAuditable, Serializable, CacheableEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
@Column(name = "createdon", nullable = false)
protected Date createdOn;
@Column(name = "updatedon")
protected Date updatedOn;
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public boolean isNew() {
return (this.id == null);
}
@Override
public Date getCreatedOn() {
return createdOn;
}
@Override
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
@Override
public Date getUpdatedOn() {
return updatedOn;
}
@Override
public void setUpdatedOn(Date updatedOn) {
this.updatedOn = updatedOn;
}
@Override
public String getCacheKey() {
return getId() == null ? "null" : String.valueOf(getId());
}
}
下面提到 sql 用于 table 创建:
create table role (
id bigint primary key not null auto_increment,
name varchar(255) not null,
role_code varchar(31) not null,
createdon datetime not null,
updatedon datetime
) engine=innodb;
create table user (
id bigint primary key not null auto_increment,
username varchar(255),
firstname varchar(255) not null,
lastname varchar(255) not null,
email varchar(255) not null,
createdon datetime not null,
updatedon datetime
) engine=innodb;
create table user_role (
id bigint primary key not null auto_increment,
roles_id bigint not null references role(id),
user_id bigint not null references user(id),
createdon datetime not null,
updatedon datetime
) engine=innodb;
我正在使用以下代码来保存具有现有角色的用户:
@Transactional
@Override
public User createUser(User user) {
Role role = roleService.getRoleByCode("Some Role");
List<Role> roles = new ArrayList<Role>();
roles.add(role);
user.setRoles(roles);
User savedUser = userRepository.save(user);
}
保存时出现 sql 错误,提示 createdon 字段没有默认值。
由于该关系是由 jpa 自行管理的实体,我很困惑需要做什么才能使其可审计。
谢谢, 罗希特·米什拉
由于 nullable = false
,您会收到该异常,您可以使用 Jpa Entity Listener,
@PrePersist
protected void persistCreatedOn(){
this.createdOn = Calendar.getInstance().getTime();
}
这样 JPA 将在持久化您的实体之前设置 createdOn
。
分析问题并花了一些时间后,我们意识到关系不应该扩展基础实体,它们不需要被审计,父实体提供了所需的信息。处理关系是底层 or 的工作。