gpt4 book ai didi

java - 避免在 Spring 中为 TImeline 功能创建重复项

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:26 25 4
gpt4 key购买 nike

我正在开发一个 Spring-MVC 项目,目前我正在为此开发时间轴功能。我已经有了一个基本的基础设施,但目前,我正在处理映射,以及如何避免为时间轴功能创建重复项。

情况:

在我们的工具中,有一个GroupSection,它与GroupNote 是一对多的映射关系。 GroupNote 对象与 Attachments、History 具有一对多的映射关系。

这个时间轴的功能是什么?

在时间线功能中,任何用户都可以在任何时间点跳转并查看GroupSection、GroupNotes、附件和历史记录的内容。

我打算如何实现它?

我在上述每个对象中都有 4 个变量来处理这个问题。它们是 Date SavedDateboolean initialNoteboolean noteModifiedboolean latestNote

除此之外,每个GroupNote都有一个自连接,稍后会解释。

现在,每次修改 Note 时,修改标志都会设置为 true。在晚上,我运行了一个方法,它检查所有修改的对象,只有当对象被修改时,它才会为对象创建一个重复的实例,将新的日期放入其中,并将其标记为最新的,并将其持久化.

这样,我可以加载给定日期的所有对象。对于正常的日常使用,将加载所有标记为 latest 的笔记。

每当为持久化创建一个新对象时,它都会通过 Cascade.Remove 自连接到旧对象。这样做的目的是,如果用户返回并从 2015 年删除该对象,那么到现在为止的所有后续对象也将被删除。这给出了类似行为的时间。

问题:

现在,如果修改了 GroupSection,那么我将创建一个 GroupSection 的实例并将其持久化,方法是从修改后的 GroupSection 复制属性,并将其标记为最新的。

现在,GroupSection 持有的注释没有被修改,但如果我不创建它的重复条目,那么我将看不到前端加载的任何注释。但我想避免这种情况。我该怎么做?

代码最后:

GroupSection 模型:

@Entity
@Table(name = "membersection")
public class GroupSection {

@Column(name = "section_save_date", columnDefinition = "date")
private Date secnSavedDate;

@Column(name = "initial_section", columnDefinition = "boolean default true")
private boolean initialSection;

@Column(name = "section_modified", columnDefinition = "boolean default false")
private boolean sectionModified;

@Column(name = "latest_section", columnDefinition = "boolean default false")
private boolean latestSection;


@JsonIgnore
@ManyToOne
@JoinColumn(name = "owned_section_id", nullable = true)
private GroupSection primarySection;

@OneToMany(mappedBy = "primarySection", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<GroupSection> groupSectionSet = new HashSet<>();

@OneToMany(mappedBy = "ownednotes", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JsonIgnore
private Set<GroupNotes> sectionsnotes = new HashSet<>();
}

GroupNotes 模型:

@Entity
@Table(name = "groupnotes")
public class GroupNotes implements Serializable {

@Column(name = "note_save_date", columnDefinition = "date")
private Date noteSavedDate;

@Column(name = "initial_note", columnDefinition = "boolean default true")
private boolean initialNote;

@Column(name = "note_modified", columnDefinition = "boolean default false")
private boolean noteModified;

@Column(name = "latest_note", columnDefinition = "boolean default false")
private boolean latestNote;

@JsonIgnore
@ManyToOne
@JoinColumn(name = "owned_note_id", nullable = true)
private GroupNotes primaryNote;

@OneToMany(mappedBy = "primaryNote", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<GroupNotes> groupNotesSet = new HashSet<>();
}

GroupSectionDAOImpl :

  @Override
@Transactional(readOnly = true)
public List<GroupSection> listGroupSectionByCanvasAndDate(int mcanvasid, Date dateToLoad) {
Session session = this.sessionFactory.getCurrentSession();
org.hibernate.Query query = session.createQuery("From GroupSection as msection where " +
"msection.currentcanvas.mcanvasid=:mcanvasid and " +
"msection.secnSavedDate>:dateToLoad " +
" and msection.sectionDisabled=false and msection.latestSection=true and msection.sectionInActive=false order by msection.secnSavedDate asc");
query.setParameter("mcanvasid", mcanvasid);
query.setParameter("dateToLoad",dateToLoad);
return query.list();
}

@Override
public List<GroupSection> listModifiedSectionsForYesterday() {
Session session = this.sessionFactory.getCurrentSession();
Calendar cal = Calendar.getInstance();
Query query = session.createQuery("from GroupSection as gs where gs.sectionModified=true and gs.latestSection=true and gs.secnSavedDate<:loadDate order by gs.secnSavedDate asc");
query.setParameter("loadDate",cal.getTime());
return query.list();
}

上述 DAO 方法为我提供了昨天修改的部分,或最后修改的部分,以及给定日期的类似部分。我在 GroupNotesDAOImpl 中有类似的方法

GroupSectionServiceImpl :

  @Override
public List<GroupSection> retrieveModifiedSections() {
List<GroupSection> groupSectionList = this.groupSectionDAO.listModifiedSectionsForYesterday();
for (GroupSection yesterdaySection : groupSectionList) {
yesterdaySection.setLatestSection(false);
this.groupSectionDAO.updateGroupSection(yesterdaySection);
GroupSection newDaySection = new GroupSection();
BeanUtils.copyProperties(yesterdaySection, newDaySection);
newDaySection.setInitialSection(false);
newDaySection.setSectionModified(false);
newDaySection.setLatestSection(true);
newDaySection.setMsectionid(0);
newDaySection.setSortedSectionSet(null);
newDaySection.setSecnSavedDate(Calendar.getInstance().getTime());
int sectionSavedId = directAddGroupSection(newDaySection, yesterdaySection.getCurrentCanvasId());

List<GroupNotes> groupNotesList = this.groupNotesService.directListGroupNotesBySectionIdForCanvasCopying(yesterdaySection.getMsectionid());

for(GroupNotes groupNotes : groupNotesList){
Problem --> // No option but to create duplicates.
}

}
return this.groupSectionDAO.listModifiedSectionsForYesterday();

}

我希望这个问题是可以理解的。如有任何疑问,请告诉我。

编辑

我能想到的一种策略是在 GroupSection 和 GroupNotes 之间进行多对多映射。不幸的是,许多后端和前端代码已经通过 GroupSection 和 GroupNotes 之间的一对多映射进行开发。尽管如此,我确实添加了多对多映射,但是数据集没有被加载,而且它增加了很多复杂性,一个正在进行中的问题 here .我仍然更喜欢其他选择。

最佳答案

我不确定应该如何触发此删除功能。对我来说,一个可行的策略是遵循一对多的关系historic GroupSection(第一个被删除的历史链)到相关的GroupNotes。此关系需要识别每个受影响的 GroupNotes相应的历史实例并导致删除该实例。

在处理 GroupSections 时,您可能需要收集对这些 GroupNotes 的引用(我假设随着时间的推移,这个集合可能会发生变化)并在最后清理结果集,以避免一遍又一遍地检查 GroupNotes。

关于java - 避免在 Spring 中为 TImeline 功能创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35719574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com