簡體   English   中英

對象在保存MongoDB Spring Data Java時不持久

[英]Object is not persisting on save mongodb spring data java

嗨,我正在使用spring data mongo在mongodb中實現審核,這是我的審核類,每個模型類都對該類進行了擴展

public abstract class Audit implements Auditable<String,String> {  
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id 
    private String id;  

    @Version  
    private Long version;  

    @CreatedBy
    private String createdBy;

    @CreatedDate
    private DateTime createdDate;  

    @LastModifiedBy
    private String lastModifiedBy;  

    @LastModifiedDate
    private DateTime lastModifiedDate;

    public boolean isNew() {  

        return id == null;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public String getCreatedBy() {
        return createdBy;
    }

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

    public DateTime getCreatedDate() {
        return createdDate;
    }

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

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

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

    public DateTime getLastModifiedDate() {
        return lastModifiedDate;
    }

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



} 

所以當我更新任何對象並調用以下函數時

//event is updated object
mongoTemplate.save(event);

保存時,我按以下方式實現了ApplicationListener,因此控件轉移到onApplicationEvent函數

public class AuditingEventListner implements ApplicationListener<BeforeConvertEvent<Object>> {

    private AuditorAware<String> auditorAware;


    public AuditingEventListner(AuditorAware<String> auditorAware) {

        this.auditorAware = auditorAware;
    }

    public void onApplicationEvent(BeforeConvertEvent<Object> event) {

        Object obj = event.getSource();
        // this obj is not persisting as i am getting object from db before updating so it should have all the values pre populated but it other then new updated values are all coming as null and result into new object creation in DB
        if (Audit.class.isAssignableFrom(obj.getClass())) {

            Audit entity = (Audit) obj;
            if (entity.isNew()) {

                entity.setCreatedBy(auditorAware.getCurrentAuditor());
                entity.setCreatedDate(new DateTime());
            }

            entity.setLastModifiedBy(auditorAware.getCurrentAuditor());
            entity.setLastModifiedDate(new DateTime());
        }
    }
}

這是我編輯事件的dao方法

public Event edit(Event event,String eventid) throws Exception,NotFoundException{

        logger.debug("Editing existing Event");

        Event existingEvent = null; 

        try {

            if(null != eventid && !eventid.equalsIgnoreCase("") ){

                existingEvent = get(eventid);
            }

            if(null ==existingEvent){

                throw new NotFoundException(eventid); 
            }

            if(null != event.getTitle() && !event.getTitle().equalsIgnoreCase(""))
            {
                existingEvent.setTitle(event.getTitle());
            }

            if(null != event.getDescription() && !event.getDescription().equalsIgnoreCase(""))
            {
                existingEvent.setDescription(event.getDescription());
            }

            if(event.getOrganizationId()!=0){

                existingEvent.setOrganizationId(event.getOrganizationId());
            }

            if(event.getEventTypeId()!=0){

                existingEvent.setEventTypeId((event.getEventTypeId()));
            }

            if(null != event.getAddress1() && !event.getAddress1().equalsIgnoreCase("")){

                existingEvent.setAddress1(event.getAddress1());
            }

            if(null != event.getAddress2() && !event.getAddress2().equalsIgnoreCase("")){

                existingEvent.setAddress2(event.getAddress2());
            }

            if(null != event.getCity() && !event.getCity().equalsIgnoreCase(""))
            {
                existingEvent.setCity(event.getCity());
            }

            if(null != event.getState() && !event.getState().equalsIgnoreCase(""))
            {
                existingEvent.setState(event.getState());
            }

            if(null!= event.getCountry() && !event.getCountry().equalsIgnoreCase(""))
            {
                existingEvent.setCountry(event.getCountry());
            }

            if(null != event.isMultiDate()){

                existingEvent.setMultiDate(event.isMultiDate());
            }

            if(null!=event.getLatitude() &&  event.getLatitude()!=0.0 && !event.getLatitude().toString().equalsIgnoreCase("") )
            {
                existingEvent.setLatitude(event.getLatitude());
            }

            if(null != event.getLongitude() && event.getLongitude() != 0.0 && !event.getLongitude().toString().equalsIgnoreCase("")){

                existingEvent.setLongitude(event.getLongitude());
            }

            if(null != event.getLastModifiedBy() && !event.getLastModifiedBy().equalsIgnoreCase(""))
            {           
                existingEvent.setLastModifiedBy(event.getLastModifiedBy());
            }

            if(null != event.getMultiLingual() && event.getMultiLingual().size() > 0 )
            {
                for(MultiLingual multiLingual:event.getMultiLingual())
                {
                    multiLingual.setId(UUID.randomUUID().toString());

                }
                existingEvent.setMultiLingual(event.getMultiLingual());
            }

            if(null !=event.getTo() && !event.getTo().toString().equalsIgnoreCase(""))
            {
                existingEvent.setTo(event.getTo());
            }

            if(null !=event.getFrom() && !event.getFrom().toString().equalsIgnoreCase(""))
            {
                existingEvent.setFrom(event.getFrom());
            }

            //existingEvent.setLastModified(new Date());

            mongoTemplate.save(event);

            return event;

        } catch (Exception e) {

            logger.error("An error has occurred while trying to edit existing event", e);

            throw e;
        }

    }

因此,在onApplicationEvent中,該對象未預先填充。 任何想法,我怎么能做到這一點。 我是在更新之前從db獲取對象的,正如您在edit方法中看到的那樣,因此它應該預先填充所有值,但其他所有新的更新值都將作為null並導致在DB中創建新對象

我有問題,我做錯了

 mongoTemplate.save(event);

我需要傳遞existEvent對象以保存方法而不是事件,因此更正

 mongoTemplate.save(existingEvent);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM