2016-03-01 30 views
10

我正在开发Spring-MVC项目,目前我正在使用它的时间线功能。我有一个基本的基础架构已经在进行中,但目前,我正在处理映射,以及如何避免为时间轴功能创建重复项。避免在Spring中为TImeline功能创建重复项

现状:

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

什么是时间轴功能?

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

我打算如何实施它?

我在上述每个对象中都有4个变量来处理这个。它们是Date SavedDate,boolean initialNote,boolean noteModified,boolean latestNote

除此之外,每个GroupNote都有一个自连接,将很快解释它。

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

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

每当为持久性创建一个新对象时,就会自动与旧对象进行自我连接,使用Cascade.Remove。这样做的是,如果用户返回并从2015年移除该对象,则直到现在的所有后续对象也将被移除。这给了一个像时间一样的行为。

问题:

现在,如果一个GroupSection被修改,那么我将创建GroupSection的实例,并坚持它,通过复制修改GroupSection特性,并将其标记为最新。

现在,GroupSection所持有的注释未被修改,但如果我不创建其重复条目,那么在前端中将看不到任何Notes。但我想避免这种情况。我怎样才能做到这一点?

代码最后:

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。我仍然会选择其他选项。

+0

hm ....关于分离实体,将id设置为null,如此处所述进行所需的更改和持续保存呢? http://stackoverflow.com/questions/11625096/cloning-jpa-entity – ivanenok

+0

@ MaximS.Ivanov:这只是创建一个重复的,我想明确避免的问题。 –

回答

0

我不知道我得到了如何触发这个删除功能。 对我而言,一个可行的策略是遵循历史GroupSection(历史链中第一个被删除的)的 到相关GroupNotes的一对多关系。这种关系需要识别每个受影响的GroupNotes 对应的历史实例并导致删除这样的实例。

您可能需要在处理GroupSections时收集对这些GroupNotes的引用(在这个集合中随时间改变,我假设) 并在最后清理结果集以避免检查GroupNotes obver和over 。

0

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

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()); 

    newDaySection.setGroupNotesSet(groupNotesList); 

     } 
     return this.groupSectionDAO.listModifiedSectionsForYesterday(); 

    } 
0

一下怎么样@ManyToOne的GroupNote - > GroupSection,而不是在GroupSection指GroupNote?

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