当前位置: 首页 > 知识库问答 >
问题:

避免在Spring中为时间线功能创建重复项

姜志行
2023-03-14

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

情况:

在我们的工具中,有GroupSection,它与GroupNote有一对多的映射。GroupNote 对象具有与附件、历史记录的一对多映射。

这个时间轴功能是什么?

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

我计划如何实施它?

我在上面的每个对象中都有4个变量来处理这个问题。它们是Date SavedDateboolean(初始值)Noteboolean note Modifyboolean 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之间的一对多映射进行开发。尽管如此,我确实添加了多对多映射,但是数据集没有被加载,它也增加了复杂性,这是一个正在进行中的问题。我仍然更喜欢其他选择。

共有3个答案

裴俊豪
2023-03-14

让@manytone加入GroupNote怎么样-

当需要修改任何GroupSection时,您可以只更新GroupSection及其修改日期。如果您希望GroupNote也被更新,您可以通过单独的查询在服务级别处理它。

刘承运
2023-03-14

我建议将 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();

    }
洪和风
2023-03-14

我不确定应该如何触发这个删除功能。对我来说,一个可行的策略是遵循从历史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呢?非常感谢您的帮助!!