有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java保存到数据库会创建多个条目

我正在编写一个管理任务和相关笔记的应用程序。这是一个Spring Boot应用程序,用户界面使用Vaadin,后端通过Hibernate访问H2数据库

该应用程序位于显示任务的“主页”上。点击一个任务可以查看详细信息,也可以点击一个按钮转到另一个页面,以查看和编辑相关的任务注释

该项目可以在github的https://github.com/jgagnon44/tasks-app中找到。我也可以在这里发布代码片段,尽管我不确定应该包括哪些内容。评论以询问物品

我看到了我无法解释的行为。当我第一次在列表中添加新的注释时,我会将其添加到另一个视图中。副本的时间戳与保存的第二张便笺的时间戳接近。如果我要添加第三个新音符,这一次第一个和第二个音符将被复制,总共有3个第一个音符、2个第二个音符和我刚才添加的第三个音符

我在关键代码点添加了调试语句,并正在打印这些代码点涉及的实体

我还在下面附上了一个带有注释的日志,以说明正在发生的一些事情

有人能告诉我发生了什么,我需要做些什么来纠正这个问题吗

日志记录:

NOTE: Task-1 has two existing TaskNote items associated with it (note-1 and note-2).

>>>>> Main page.
>>>>> Select Task-1 in grid.
>>>>> Click Edit Notes button.

[INFO ] 2021-04-14 15:02:25.340 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: null
[INFO ] 2021-04-14 15:02:25.358 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:02:25.361 com.fossfloors.taskapp.ui.view.NotesListView.lambda$7(NotesListView.java:104) - NOTES: [TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2]]

>>>>> Notes List page.
>>>>> Click Add button.
>>>>> Enter note 3.
>>>>> Click Save button.
>>>>> Note 3 appears in notes list.

[INFO ] 2021-04-14 15:03:05.709 com.fossfloors.taskapp.ui.view.NotesListView.saveNote(NotesListView.java:159) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:03:05.709 com.fossfloors.taskapp.ui.view.NotesListView.saveNote(NotesListView.java:160) - NOTE: TaskNote [hashCode=1422869202, note=Note 3]
[INFO ] 2021-04-14 15:03:05.731 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=1422869202, note=Note 3]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:03:05.735 com.fossfloors.taskapp.ui.view.NotesListView.lambda$7(NotesListView.java:104) - NOTES: [TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=333570519, note=Note 3]]

>>>>> Click Add button.
>>>>> Enter note 4.
>>>>> Click Save button.
>>>>> Note 4 appears in notes list. Notice that a second note 3 appears with a similar timestamp as note 4.

[INFO ] 2021-04-14 15:03:27.617 com.fossfloors.taskapp.ui.view.NotesListView.saveNote(NotesListView.java:159) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=1422869202, note=Note 3]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:03:27.618 com.fossfloors.taskapp.ui.view.NotesListView.saveNote(NotesListView.java:160) - NOTE: TaskNote [hashCode=1422869203, note=Note 4]
[INFO ] 2021-04-14 15:03:27.628 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=1422869202, note=Note 3], TaskNote [hashCode=1422869203, note=Note 4]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:03:27.634 com.fossfloors.taskapp.ui.view.NotesListView.lambda$7(NotesListView.java:104) - NOTES: [TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=333570519, note=Note 3], TaskNote [hashCode=-1887191816, note=Note 3], TaskNote [hashCode=-1221858374, note=Note 4]]

>>>>> Click Back button.
>>>>> Main page.
>>>>> Select Task-1 in grid.
>>>>> Click Edit Notes button. There are five notes.

[INFO ] 2021-04-14 15:03:44.434 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: null
[INFO ] 2021-04-14 15:03:44.439 com.fossfloors.taskapp.ui.view.NotesListView.refresh(NotesListView.java:100) - PARENT: Task [hashcode=-523436836, title=Task-1, description=null, type=RECURRING, state=OPEN, priority=HIGH, notes=[TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=333570519, note=Note 3], TaskNote [hashCode=-1887191816, note=Note 3], TaskNote [hashCode=-1221858374, note=Note 4]], dateClosed=null, dateDue=null, dateStarted=null, dateCompleted=null]
[INFO ] 2021-04-14 15:03:44.444 com.fossfloors.taskapp.ui.view.NotesListView.lambda$7(NotesListView.java:104) - NOTES: [TaskNote [hashCode=-331664091, note=note-1], TaskNote [hashCode=-823479065, note=note-2], TaskNote [hashCode=333570519, note=Note 3], TaskNote [hashCode=-1887191816, note=Note 3], TaskNote [hashCode=-1221858374, note=Note 4]]

共 (1) 个答案

  1. # 1 楼答案

    我浏览了一下你的git,我认为问题是你保存了一个Task,它与TaskNote列表有级联关系,但是你传递了一个过时的Task实例,它没有你之前保存的所有TaskNotes

    确保在保存后更新parentTask,以便它跟踪其当前状态(持久化!)任务笔记。这应该确保在后续保存时不会复制数据库中的关系。保存后,您已经在视图上执行了refresh(),但仍然忘记了更新那里的parentTask实例
    下面是改进refresh方法的方法:

    private void refresh() {
        logger.info("PARENT: {}", parentTask);
        if (parentTask != null) {
          Optional<Task> optTask = taskService.findById(parentTask.getId());
          optTask.ifPresent(task -> {
            logger.info("NOTES: {}", task.getNotes());
            this.parentTask = task;    // UPDATE PARENTTASK INSTANCE HERE!!
            grid.setItems(task.getNotes());
          });
        } else {
          grid.setItems();
        }
      }