尝试插入具有A另一个实体set的实体-B时,B应该从Id中获取自动生成的A,但从其null中获取。

尝试并失败:


@MapsId("taskPKId.storyId.id")-同样的错误。
@Embeddable class StoryId { @ManyToOne(fetch = FetchType.Lazy) @JoinColumn(name = "STORY_ID") Long id; } //不可理解的空指针异常
mappedBy("story")-同样的错误


尝试过使用appedBy('story'),但在重复列时出错,因此必须使用insertable=falseupdatable=false进行映射[Hibernate无法识别insertable=false@EmbeddedId]



我正在获取STORY_ID = null,因此saveAllstoryRepository.saveAll(stories)上失败,其中storyRepository是Spring数据存储库

@Table(name = "STORY")
@EqualsAndHashCode
class Story {
   @Id
   @GeneratedValue(stratergy=GenerationType.Auto)
   @Column(name="STORY_ID")
   Long id;

   @Column(name="STORY_NAME")
   String name;

   //@OneToMany(cascade=ALL, mappedBy="taskPKId.storyId.id", fetch = FetchType.Lazy) // tried this as well
   @OneToMany(cascade=ALL, mappedBy="story", fetch = FetchType.Lazy)
   Set<Task> task;
}

@Table(name = "TASK_XREF")
@EqualsAndHashCode
Class Task {
   @EmbeddedId
   TaskPKId taskPKId;

   @Column(name = "TASK_NAME")
   String name;

   @ManyToOne (fetch = FetchType.Lazy, optional = false)
   @JoinColumn(name = "STORY_ID", referencedColumnName = "STORY_ID", nullable = false, insertable = false, updatable = false)
   Story story;
}

@Embeddable
@EqualsAndHashCode
Class TaskPKId  implements Serializable {
   TaskId taskId;
   TaskTypeId taskTypeId;
   StoryId storyId;
}

@Embeddable
@EqualsAndHashCode
class StoryId implements Serializable {
   @Column(name = "STORY_ID")
   Long id;
}


表格:


故事[STORY_IDSTORY_NAME]
TASK_XREF [(TASK_ID(FK), TASK_TYPE_ID(FK), STORY_ID(FK)) PK,TASK_NAME]


故事被插入(在提交课程之前),但是失败,因为在下一次插入时STORY_ID作为null发送给TASK_XREF

最佳答案

我不太确定为什么您的配置不起作用。在我的一个项目中,我有一个类似的配置,可以正常工作。通过在Task类的ManyToOne中添加@MapsId批注,我能够找到解决方案。 (有关MapsId的说明,请参见can someone please explain me @MapsId in hibernate?)我还删除了insertable = false和updatable = false。参见下面的代码。

我没有让MapsId与StoryId类一起使用,因此我将TaskPKID.storyId的类型从StoryId更改为long。 StoryId类似乎并没有增加太多,因此希望这不是什么大问题。如果您找到解决方案,请在评论中让我知道!

顺便说一句,您的代码有很多问题。有很多错别字,并且在不是Collection的属性上存在一个OneToMany映射(这是不允许的),这使我更难以调试问题。请确保下次在您的问题中张贴质量更好的代码。

这是我实现它的方式的Task类:

@Entity
@Table(name = "TASK_XREF")
class Task {
    @EmbeddedId
    TaskPKId taskPKId;

    @Column(name = "TASK_NAME")
    String name;
    @MapsId("storyId")
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "STORY_ID")
    Story story;

    //getters, setters

}


这是TaskPKID类:

@Embeddable
class TaskPKId  implements Serializable {
        long taskId;
        long taskTypeId;
        @Column(name="STORY_ID")
        long storyId;

    public long getTaskId() {
        return taskId;
    }

    public void setTaskId(long taskId) {
        this.taskId = taskId;
    }

    public void setTaskTypeId(long taskTypeId) {
        this.taskTypeId = taskTypeId;
    }
}

关于java - 自动生成的ID未在Hibernate的子实体中的EmbeddedId上级联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56200263/

10-09 03:09