尝试插入具有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=false
和updatable=false
进行映射[Hibernate无法识别insertable=false
为@EmbeddedId
]
我正在获取STORY_ID = null
,因此saveAll
在storyRepository.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_ID
,STORY_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/