我正在从事一个Spring MVC项目,目前正在为该项目开发时间线功能。我已经有了一个基本的基础设施,但目前,我正在处理映射,以及如何避免为时间轴功能创建重复项。
情况:
在我们的工具中,有GroupSection,它与GroupNote有一对多的映射。GroupNote 对象具有与附件、历史记录的一对多映射。
这个时间轴功能是什么?
在时间轴功能中,任何用户都可以在任何时间点跳转,并检查GroupSection,GroupNotes,附件和历史记录的内容。
我计划如何实施它?
我在上面的每个对象中都有4个变量来处理这个问题。它们是Date SavedDate
、boolean(初始值)Note
、boolean note Modify
、boolean latestNote
。
除此之外,每个GroupNote都有一个自加入功能,我们将很快对此进行解释。
现在,每次修改注释时,修改标志都设置为true。晚上,我运行一个方法,检查所有修改过的对象,只有当对象被修改时,它才会为该对象创建一个重复实例,将新日期放入其中,将其标记为最新日期,并将其持久化。
这样,我可以加载给定日期的所有对象。对于日常使用,所有标记为< code>latest的便笺都会被加载。
每当为持久性创建新对象时,它都会与旧对象自连接,使用<code>级联。删除<code>。这意味着,如果用户返回并从2015年删除该对象,那么直到现在的所有后续对象都将被删除。这会产生类似时间的行为。
问题:
现在,如果修改了 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中有类似的方法
组组服务I mpl:
@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之间的一对多映射进行开发。尽管如此,我确实添加了多对多映射,但是数据集没有被加载,它也增加了复杂性,这是一个正在进行中的问题。我仍然更喜欢其他选择。
让@manytone加入GroupNote怎么样-
当需要修改任何GroupSection时,您可以只更新GroupSection及其修改日期。如果您希望GroupNote也被更新,您可以通过单独的查询在服务级别处理它。
我建议将 GroupSection 和 GroupNotes 之间的关联更改为多对多,以避免重复的 groupnotes。
@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<>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "groupsection_groupnote", joinColumns = {
@JoinColumn(name = "GROUP_SECTION_ID", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "GROUP_NOTE_ID",
nullable = false, updatable = false) })
@JsonIgnore
private Set<GroupNotes> sectionsnotes = new HashSet<>();
}
组组服务I mpl:
@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());
newDaySection.setGroupNotesSet(groupNotesList);
}
return this.groupSectionDAO.listModifiedSectionsForYesterday();
}
我不确定应该如何触发这个删除功能。对我来说,一个可行的策略是遵循从历史GroupPart(历史链中第一个要删除的)到相关GroupNotes的一对多关系。这种关系需要识别每个受影响的GroupNotes的相应历史实例并导致此类实例的删除。
您可能需要在处理GroupSections时收集对这些GroupNotes的引用(我认为随着时间的推移,该集合可能会发生变化),并在最后清理生成的集合,以避免反复检查GroupNotes。
问题内容: @Scheduled(fixedDelay = 5000) public void myJob() { Thread.sleep(12000); } 如果先前的例程尚未完成,如何防止此spring作业运行? 问题答案: 使用,该时间段是在工作完成后计算的,因此无需担心。
本文向大家介绍避免在MongoDB中重复输入?,包括了避免在MongoDB中重复输入?的使用技巧和注意事项,需要的朋友参考一下 为了避免在MongoDB中重复输入,可以使用。语法如下- 让我们实现以上语法。避免在MongoDB中重复条目的查询如下- 现在在上面的集合中插入一些记录。插入记录的查询如下- 每当您尝试再次插入相同记录时,都会出现此错误- 让我们插入另一条记录。查询如下- 在method
你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况
问题内容: 我们有一个相当简单的node.js应用程序,但是由于AWS Elastic Beanstalk部署机制,即使提交了一个文件,也需要大约5分钟(通过)推出新版本。 即,提交本身(和上载)非常快(仅可推送1个文件),但是Elastic Beanstalk从S3获取整个包,将其解压缩并运行,这导致node-gyp编译一些模块。安装/构建完成后,Elastic Beanstalk会擦除并用新的
问题内容: 从一段时间开始,我就在开发Spring-MVC应用程序。最近,我遇到了@Scheduled方法的一些问题,并且我注意到整个配置被加载了4次。因此,@ Scheduled方法被调用了4次。 这3种不正确的配置会因NullPointerException(我在SO上被告知)而消失,并且其中一种幸存。我非常想知道如何正确配置项目,因此只加载了一种配置,而不是4种,并在此过程中了解了Sprin
我只是一个JavaScript的初学者,我需要您的帮助来优化我的代码。 这里的事实是,当我点击这个div: 此脚本将被激活: 最后在屏幕上显示一个div: 实际上,它是工作的,但我需要这样做8次,因为我有8个按钮,必须显示8个不同的div在屏幕上。那么我如何才能优化我的脚本,避免做8个addEventListener呢?非常感谢您的帮助!!