2017-06-26 2 views
0

Wir haben eine Microweb-Dienstumgebung, in der AbstractAuditingEntity von einem anderen gemeinsamen Mikro-Dienst stammt. Und ich möchte @CreatedBy Eigenschaft dieser abstrakten Klasse mit meinem eigenen definierten Wert überschreiben.So überschreiben Sie den @CreatedBY-Wert von AbstractAuditingEntity im Frühling JPA

Mein Code ist unten angegeben.

@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; 
} 
} 

Und meine Domain-Klasse ist wie

@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; 
    } 

} 

Wenn wir versuchen, in der Datenbank dieses Domain-Objekt zu beharren, userdef Wert von mir zur Verfügung gestellt wird, nicht fortbestehen immer noch statt Spring-Framework seine eigene Zugabe Wert. Ich habe versucht, @AttributeOverride, aber es funktioniert nicht in meinem Fall.

Vielen Dank im Voraus für Hilfe.

Antwort

1

für: Benutzer definierten Wert von mir zur Verfügung gestellt wird, bestehen nach wie vor nicht zu bekommen, anstatt Spring-Framework seinen eigenen Wert Hinzufügen

Sie es mit AuditorAware Schnittstelle tun. 3.1.3 AuditorAware

Falls Sie verwenden entweder @CreatedBy oder @LastModifiedBy, die Wirtschaftsprüfungs Infrastruktur muss irgendwie Kenntnis von der aktuellen Haupt werden. Um dies zu tun, bieten wir eine AuditorAware SPI-Schnittstelle, die Sie implementieren müssen, um der Infrastruktur mitzuteilen, wer der aktuelle Benutzer oder das System mit der Anwendung interagieren. Der generische Typ T definiert von welchen Typ die mit @CreatedBy oder @LastModifiedBy annotierten Eigenschaften haben müssen.

Hier ist ein Beispiel Implementierung der Schnittstelle mit Spring Security Authentication Objekt:

Beispiel 3.2. Die Umsetzung der AuditorAware basierend auf Spring Security

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

Beachten Sie, dass die natürliche Vorgehensweise * ohne Spring * darin besteht, einen 'RevisionEntityListener' zu erstellen und den Wert für die Revisionsinstanz festzulegen, nachdem Envers sie erstellt hat. Das Obige ist im Wesentlichen Spring's Wrapper um dieses Feature. – Naros

+0

Ich bin mir dieses Szenarios bewusst. Aber alle diese Konfigurations- und AuditorAware-Schnittstelle ist in einem gemeinsamen Dienst implementiert, der von vielen anderen Diensten verwendet wird. Und jetzt kommt mein aktueller CreatedBy und Updatedby Wert nur auf diese Weise. Aber ich möchte diesen Wert in meinem individuellen Dienst mit einem anderen Wert überschreiben. Gibt es eine Möglichkeit, dies zu tun? Danke für Ihren Vorschlag. Aber ich suche nach mehr Lösung. – Kat

1

Ich habe wie unten eine Lösung.

Mit @PrePersist kann ich den Wert überschreiben, den ich von einem gemeinsamen Framework bekomme.

Verwandte Themen