2015-05-15 53 views
0

嗨,由於審計問題,我很難保存manytomany映射實體之一。spring data jpa多對多映射審計失敗

我們使用spring數據和基本實體來管理審計信息。 這一切工作正常,但對於一個manytomany映射我得到的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:

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自我管理的實體,所以我很困惑需要做些什麼才能使其可審計。

感謝, 羅希特·米什拉

回答

0

經過分析問題並花了一些時間,我們認識到關係不應該擴展基礎實體,他們不需要審計,母公司提供所需的信息。它是下面的orm來處理這種關係的工作。

0

您獲得的異常,因爲nullable = false的,你可以用一個Jpa Entity Listener

@PrePersist 
    protected void persistCreatedOn(){ 
     this.createdOn = Calendar.getInstance().getTime(); 
    } 

這樣JPA將設置createdOn只是堅持你的實體之前。