【问题标题】:How does Spring Data (MongoDB) read an object?Spring Data (MongoDB) 如何读取对象?
【发布时间】:2015-03-23 04:07:50
【问题描述】:

我目前正在开发一个使用 Spring 框架和 SpringData MongoDB (v.1.6.1 RELEASE) 的项目。我现在想向存储的对象添加一个属性,这将简化它的检索,但我需要根据我想要保存它的时间点对象的状态来计算这个属性。我试图将该计算放在对象的 getter 方法中,但不知何故 SpringData 没有使用 getter 来访问该属性。

具体例子如下: 我将事件存储在数据库中,并且允许事件跨越多个日期,从而创建一个多日期事件。事件由开始日期 (LocalDateTime) 和结束日期 (LocalDateTime) 定义。我现在想将信息存储在数据库中,无论该事件是否为多日期事件。最后,我向事件 (multiDate) 添加了一个布尔变量。在 getter (isMultiDate) 中,我比较开始日期和结束日期并返回真或假(取决于日期)。

我的事件对象:

public class Event
{
    @Id
    private String id;

    @NotBlank
    private String name;
    private String description;
    private String location;
    private double locationLat;
    private double locationLog;

    @NotNull
    @JsonIgnore
    private int startDateDayOfMonth, startDateMonth, startDateYear, startDateHour, startDateMinute;
    @NotNull
    @JsonIgnore
    private int endDateDayOfMonth, endDateMonth,endDateYear, endDateHour, endDateMinute;

    @LastModifiedDate
    private Date lastChanged;

    @Transient
    private LocalDateTime startDateTime;

    @Transient
    private LocalDateTime endDateTime;

    private boolean multiDate;

    @DBRef
    @NotEmpty
    private List<Division> invitedDivision;

    public Event() {}

    public String getId()
    {
        return id;
    }

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

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getDescription()
    {
        return description;
    }

    public void setDescription(String description)
    {
        this.description = description;
    }

    public String getLocation()
    {
        return location;
    }

    public void setLocation(String location)
    {
        this.location = location;
    }

    public double getLocationLat()
    {
        return locationLat;
    }

    public void setLocationLat(double locationLat)
    {
        this.locationLat = locationLat;
    }

    public double getLocationLog()
    {
        return locationLog;
    }

    public void setLocationLog(double locationLog)
    {
        this.locationLog = locationLog;
    }

    public int getStartDateDayOfMonth()
    {
        return startDateDayOfMonth;
    }

    public void setStartDateDayOfMonth(int startDateDayOfMonth)
    {
        this.startDateDayOfMonth = startDateDayOfMonth;
    }

    public int getStartDateMonth()
    {
        return startDateMonth;
    }

    public void setStartDateMonth(int startDateMonth)
    {
        this.startDateMonth = startDateMonth;
    }

    public int getStartDateYear()
    {
        return startDateYear;
    }

    public void setStartDateYear(int startDateYear)
    {
        this.startDateYear = startDateYear;
    }

    public int getStartDateHour()
    {
        return startDateHour;
    }

    public void setStartDateHour(int startDateHour)
    {
        this.startDateHour = startDateHour;
    }

    public int getStartDateMinute()
    {
        return startDateMinute;
    }

    public void setStartDateMinute(int startDateMinute)
    {
        this.startDateMinute = startDateMinute;
    }

    public int getEndDateDayOfMonth()
    {
        return endDateDayOfMonth;
    }

    public void setEndDateDayOfMonth(int endDateDayOfMonth)
    {
        this.endDateDayOfMonth = endDateDayOfMonth;
    }

    public int getEndDateMonth()
    {
        return endDateMonth;
    }

    public void setEndDateMonth(int endDateMonth)
    {
        this.endDateMonth = endDateMonth;
    }

    public int getEndDateYear()
    {
        return endDateYear;
    }

    public void setEndDateYear(int endDateYear)
    {
        this.endDateYear = endDateYear;
    }

    public int getEndDateHour()
    {
        return endDateHour;
    }

    public void setEndDateHour(int endDateHour)
    {
        this.endDateHour = endDateHour;
    }

    public int getEndDateMinute()
    {
        return endDateMinute;
    }

    public void setEndDateMinute(int endDateMinute)
    {
        this.endDateMinute = endDateMinute;
    }

    public Date getLastChanged()
    {
        return lastChanged;
    }

    public void setLastChanged(Date lastChanged)
    {
        this.lastChanged = lastChanged;
    }

    public LocalDateTime getStartDateTime()
    {
        startDateTime = LocalDateTime.of(startDateYear, startDateMonth, startDateDayOfMonth, startDateHour, startDateMinute);
        return startDateTime;
    }

    public void setStartDateTime(LocalDateTime startDateTime)
    {
        this.startDateTime = startDateTime;
        if(startDateTime != null)
        {
            startDateYear = startDateTime.getYear();
            startDateMonth = startDateTime.getMonthValue();
            startDateDayOfMonth = startDateTime.getDayOfMonth();
            startDateHour = startDateTime.getHour();
            startDateMinute = startDateTime.getMinute();
        }
    }

    public LocalDateTime getEndDateTime()
    {
        endDateTime = LocalDateTime.of(endDateYear, endDateMonth, endDateDayOfMonth, endDateHour, endDateMinute);
        return endDateTime;
    }

    public void setEndDateTime(LocalDateTime endDateTime)
    {
        this.endDateTime = endDateTime;
        if(endDateTime != null)
        {
            endDateYear = endDateTime.getYear();
            endDateMonth = endDateTime.getMonthValue();
            endDateDayOfMonth = endDateTime.getDayOfMonth();
            endDateHour = endDateTime.getHour();
            endDateMinute = endDateTime.getMinute();
        }
    }

    public List<Division> getInvitedDivision()
    {
        return invitedDivision;
    }

    /**
     * The function is setting all invited divisions, but is optimizing the set by eliminating unnecessary divisions.
     * @param invitedDivision
     */
    public void setInvitedDivision(List<Division> invitedDivision)
    {
        if(invitedDivision != null)
        {
            this.invitedDivision = DivisionManagementController.getOptimizedSetOfDivisions(invitedDivision);
        } else
        {
            this.invitedDivision = invitedDivision;
        }
    }

    public void addDivision(Division division)
    {
        if(invitedDivision == null)
        {
            invitedDivision = new ArrayList<>();
        }
        invitedDivision.add(division);
    }

    public boolean isMultiDate()
    {
        return (startDateDayOfMonth != endDateDayOfMonth) || (startDateMonth != endDateMonth) || (startDateYear != endDateYear);
    }

    public void setMultiDate(boolean multiDate)
    {
        this.multiDate = multiDate;
    }
}

我做错了什么?为什么 SpringData 不使用公共 getter 访问私有变量? (实际上我总是返回 true,而数据库仍然只显示存储 false)。

提前致谢!

【问题讨论】:

    标签: java spring spring-data spring-data-mongodb


    【解决方案1】:

    我仍然不清楚这个问题,但试试这个

    public boolean isMultiDate()
    {
        multiDate = (startDateDayOfMonth != endDateDayOfMonth) || (startDateMonth != endDateMonth) || (startDateYear != endDateYear);
        return multiDate;
    }
    

    【讨论】:

    • 在回答之前可能会在评论中要求澄清。
    • 同意。 @Fat_FS,您能否澄清一下 multiDate 没有被更新或 isMultiDate() 方法没有被调用的问题。但是要更新 MongodB 中的值,请使用我建议的方法,但之后立即调用 db.save() 。您可能需要将方法名称更改为 getMultiDate() 以确保正在调用该方法。
    • 问题是 isMultiDate() 不知何故从未被调用过。用例:我创建了对象,输入了开始和结束日期等所有信息,但我没有主动调用 isMultiDate() 函数(我知道我可以这样做)。这意味着未设置 multiDate 值。调用 db.save() 时,我希望 Spring Data 能够通过调用 isMultiDate() 来访问 multiDate 以读取值,然后将其存储在数据库中,但不知何故,情况并非如此。
    • @Fat_FS,感谢您的澄清。调用 db.save() 不会让 mongodb 调用 isMultiDate()。我建议每次添加有效的结束日期时,将多日期标志设置为 true,然后调用 db.save()。这会将值正确保存到数据库中。
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 2014-04-29
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多