gpt4 book ai didi

java - 自动生成的 id 未级联在 Hibernate 子实体中的 EmbeddedId 上

转载 作者:行者123 更新时间:2023-11-30 05:38:17 24 4
gpt4 key购买 nike

当尝试插入一个实体 - A 和一个 set 另一个实体 B 时,B 应该得到从 A 自动生成 Id,但其 null

尝试过但失败了:

  1. @MapsId("taskPKId.storyId.id") - 同样的错误。
  2. @Embeddable
    类 StoryId {
    @ManyToOne(fetch = FetchType.Lazy)
    @JoinColumn(名称 = "STORY_ID")
    长 ID;
    }
    //不可理解的空指针异常
  3. mappedBy("story") - 同样的错误
  4. 尝试使用mappedBy('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;
}

表格:

  1. STORY [STORY_ID, STORY_NAME]
  2. 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 和 updatetable=false。请参阅下面的代码。

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

顺便说一下,你的代码有很多问题。有一堆拼写错误,并且在不是集合的属性上有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com