2017-06-26 48 views
0

我們有一個微型業務環境,AbstractAuditingEntity來自另一個常見的微型服務。我想用我自己定義的值覆蓋這個抽象類的@CreatedBy屬性。如何在Spring中重寫AbstractAuditingEntity中的@CreatedBY值JPA

我的代碼如下。

@MappedSuperclass 
@EntityListeners(AuditingEntityListener.class) 
public abstract class AbstractAuditingEntity { 

@Column(name = "created_by", insertable = true, updatable = false,  nullable = false) 
@CreatedBy 
private String createdBy; 

@Column(name = "created_date", insertable = true, updatable = false, nullable = false) 
@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
@CreatedDate 
private DateTime createdDate; 

@Column(name = "last_modified_by", nullable = false) 
@LastModifiedBy 
private String lastModifiedBy; 

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
@LastModifiedDate 
private DateTime lastModifiedDate; 

// @Transient 
public abstract Long getInternalId(); 

// @Transient 
public abstract void setInternalId(Long internalId); 

public DateTime getCreatedDate() { 
return createdDate; 
} 

public void setCreatedDate(DateTime createdDate) { 
this.createdDate = createdDate; 
} 

public DateTime getLastModifiedDate() { 
return lastModifiedDate; 
} 

public void setLastModifiedDate(DateTime lastModifiedDate) { 
this.lastModifiedDate = lastModifiedDate; 
} 

public String getCreatedBy() { 
return createdBy; 
} 

public void setCreatedBy(String createdBy) { 
this.createdBy = createdBy; 
} 

public String getLastModifiedBy() { 
return lastModifiedBy; 
} 

public void setLastModifiedBy(String lastModifiedBy) { 
this.lastModifiedBy = lastModifiedBy; 
} 
} 

我的領域類是像

@Entity 
@Table(name = "programs") 
@AttributeOverride(name = "createdBy", column = @Column(name = "created_by")) 
public class Program extends AbstractAuditingEntity { 

@Id 
@SequenceGenerator(name = "programs_seq", sequenceName = "programs_seq") 
@GeneratedValue(generator = "programs_seq") 
@Column(name = "internal_id", nullable = false) 
private Long internalId; 

private String programName; 

@Override 
public String toString() { 
    return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE); 
} 
//Start getters & setters - auto generated by IDE 

@Override 
public Long getInternalId() { 
    return internalId; 
} 

@Override 
    public void setInternalId(Long internalId) { 
    this.internalId = internalId; 
    } 

    public String getProgramName() { 
    return programName; 
    } 

    public void setProgramName(String programName) { 
    this.programName = programName; 
    } 

} 

當我們試圖堅持在數據庫中該域對象,由我提供的用戶定義的值沒有得到持續,而不是Spring框架還加入了自己值。我已經嘗試@AttributeOverride,但它不適用於我的情況。

在此先感謝您的幫助。

回答

1

爲:由我公司提供用戶定義的價值沒有得到堅持,而不是Spring框架還增加了自身的價值

你可以用AuditorAware接口做到這一點。 3.1.3 AuditorAware

如果您使用@CreatedBy或@LastModifiedBy,審計 基礎設施在某種程度上需要意識到當前主要的。 爲此,我們提供一個AuditorAware SPI接口,您必須使用 實施程序來告知基礎結構與當前用戶或系統 是否與應用程序進行交互。泛型類型T定義了 哪些類型的屬性使用@CreatedBy或@LastModifiedBy 進行了註釋。

下面是一個示例實現使用Spring 安全的認證對象的接口:

例3.2。基於Spring的安全

class SpringSecurityAuditorAware implements AuditorAware<User> { 

    public User getCurrentAuditor() { 

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

    if (authentication == null || !authentication.isAuthenticated()) { 
     return null; 
    } 

    return ((MyUserDetails) authentication.getPrincipal()).getUser(); 
    } 
} 
+0

請注意在沒有Spring的情況下執行此操作的自然方法是創建一個'RevisionEntityListener'並在Envers構建它之後在修訂實體實例上設置值。以上是本質上Spring的封裝。 – Naros

+0

我知道這種情況。但所有這些配置和AuditorAware接口都是在許多其他服務使用的通用服務中實現的。而現在我目前的CreatedBy和Updatedby的價值只是以這種方式來的。但是我想在個人服務中以不同的價值覆蓋這個價值,有沒有什麼辦法可以做到這一點。 感謝您的建議。但我正在尋找更多解決方案。 – Kat

1

AuditorAware執行我下面的解決方案。

@PrePersist 
private void setCreateByNew() { 
    setCreatedBy("anonymousUser");  
} 

使用@PrePersist我能夠覆蓋我從通用框架獲得的值。

相關問題