自动生成的ID未在冬眠的儿童实体中嵌入的嵌入式ID



尝试插入实体-A使用set另一个实体BB应从A中获得自动生成的Id,但其null

尝试并失败:

  1. @MapsId("taskPKId.storyId.id")-相同的错误。
  2. @Embeddable class StoryId { @ManyToOne(fetch = FetchType.Lazy) @JoinColumn(name = "STORY_ID") Long id; }//难以理解的无效指针异常
  3. mappedBy("story")-相同的错误
    1. 尝试使用mappedby('Story'(,但使用重复的列获得错误,因此必须使用insertable=falseupdatable=false [Hibernate不识别insertable=false的CC_13]

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

@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;
}

表:

  1. 故事 [STORY_IDSTORY_NAME]
  2. task_xref [(TASK_ID(FK), TASK_TYPE_ID(FK), STORY_ID(FK)) PK,TASK_NAME]

故事被插入(当然是在提交之前(,但由于 STORY_ID被以null的形式发送到 TASK_XREF而失败,下一个插入

我不太确定为什么您的配置不起作用。在我的一个项目中,我也有类似的配置,效果很好。但是,我能够通过在任务类中的许多人添加@mapsid注释来找到解决方案。(请参阅有人可以在Hibernate中解释我@Mapsid吗?有关MAPSID的说明(我还删除了插入= false和更新= false。请参阅下面的代码。

我没有Mapsid与StoryID课程一起工作,所以我将Taskpkid.storyid的类型从StoryID更改为Long。StoryID课程似乎并没有增加太多,因此希望这不是一个问题。如果您找到解决方案,请在评论中告诉我!

顺便说一句,您的代码有很多问题。有一堆错字,并且在不属于集合的属性上有一个oneTomany映射(不允许(这使我更加困难地调试问题。请确保下次在问题中发布更好的质量代码。

这是我实施的任务类:

@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;
    }
}

我不确定您要实现什么,但是看起来您已经将@OneToMany注释与@OneToOne -like实现结合在一起(这可能会导致这样的意外行为(。

可能的解决方案:

  1. 如果一个故事拥有多个任务

    // Story.java     
    @OneToMany(cascade=ALL, mappedBy="story", fetch = FetchType.Lazy)
    Set<Task> task; // basically Set, List or any other collection type
    // Task.java
    @ManyToOne (fetch = FetchType.Lazy, optional = false)
    @JoinColumn(name = "STORY_ID", referencedColumnName = "STORY_ID") 
    Story story;
    
  2. 如果一个故事只有一个任务

    // Story.java 
    @OneToOne(cascade=ALL, mappedBy="story", fetch = FetchType.Lazy)
    Task task;
    // Task.java
    @OneToOne (fetch = FetchType.Lazy, optional = false)
    @JoinColumn(name = "STORY_ID", referencedColumnName = "STORY_ID") 
    Story story;
    

进一步阅读:@OnetoOne@Onetomany

相关内容

  • 没有找到相关文章

最新更新