【发布时间】:2014-08-13 19:58:20
【问题描述】:
在一种情况下,我在将我的数据库域模型映射到程序实体时遇到问题,其中实体本质上是一个连接表(一个周期),它结合了其他两个实体(一个时间段和一天)。然后另一个实体(一课)引用了这个时期实体,确定它何时发生。
当我尝试使用 saveOrUpdate(lesson) 保存带有新时期的课程时,hibernate 会抛出 IdentifierGenerationException
org.hibernate.id.IdentifierGenerationException: null id 为:class com.trials.domain.Period 生成
数据库如下图(不是真正的数据库,只是关键的表和列)
在 java hibernate 模型中,我使用了一个嵌入的 id 作为 period 类的主键,然后课程类引用了一个 period。
Period.java
@Entity
@Table(name = "period")
public class Period{
@EmbeddedId
private PeriodId periodId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "day_idday", nullable = false, insertable = false, updatable = false)
private Day day;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "timeslot_idtimeslot", nullable = false, insertable = false, updatable = false)
private Timeslot timeslot;
//constructors, getters, setters, hashcode, and equals
}
而嵌入的id只有主键列:
PeriodId.java
@Embeddable
public class PeriodId implements Serializable {
@Column(name = "timeslot_idtimeslot")
private int timeslotId;
@Column(name = "day_idday")
private int dayId;
//constructors, getters, setters, hashcode, and equals
}
然后是使用句号定义为的课程类:
Lesson.java
@Entity
@Table(name = "lesson")
public class Lesson {
@Id
@Column(name = "idlesson")
private int lessonId;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumns({@JoinColumn(name = "period_timeslot_idtimeslot", nullable = false, updatable = false), @JoinColumn(name = "period_day_idday", nullable = false, updatable = false)})
private Period period;
//constructors, getters, setters, hashcode, and equals
}
Timeslot 和 Day 实体类都是非常基本的 pojo,它们的 id 使用 GenerationType.AUTO。所以我的问题是:
- 导致此 IdentifierGenerationException 的原因
- 如何在保持相同数据库模型的同时避免这种情况
提前致谢
【问题讨论】:
-
@Xstian 我已经阅读了许多关于类似问题的 SO 问题,包括该问题的答案,这与我的问题不同。我没有手动管理任何键,只是以一种起初看起来很简单的方式使用嵌入式 id
标签: java hibernate jpa hibernate-annotations