尝试插入实体-A
使用set
另一个实体B
,B
应从A
中获得自动生成的Id
,但其null
。
尝试并失败:
-
@MapsId("taskPKId.storyId.id")
-相同的错误。 -
@Embeddable class StoryId { @ManyToOne(fetch = FetchType.Lazy) @JoinColumn(name = "STORY_ID") Long id; }
//难以理解的无效指针异常 -
mappedBy("story")
-相同的错误- 尝试使用mappedby('Story'(,但使用重复的列获得错误,因此必须使用
insertable=false
和updatable=false
[Hibernate不识别insertable=false
的CC_13]
- 尝试使用mappedby('Story'(,但使用重复的列获得错误,因此必须使用
我正在获取STORY_ID = null
,因此saveAll
在storyRepository.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;
}
表:
- 故事 [
STORY_ID
,STORY_NAME
] - 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实现结合在一起(这可能会导致这样的意外行为(。
可能的解决方案:
-
如果一个故事拥有多个任务
// 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;
-
如果一个故事只有一个任务
// 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