在Hibernate创建数据库的过程中,它为表中id_student
oe_iv_student_lang
外键添加唯一键约束,因为我们必须实现Serializable
接口,这导致Hibernate不允许我们在其相应的子表中添加具有相同父外键的多行。
我附上了片段以便更好地理解。.
学生班:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "oe_iv_student")
public class OeIvStudent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_student")
private Integer idStudent;
}
学生郎班:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "oe_iv_student_lang")
public class OeIvStudentLang implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_student_lang")
private Integer idStudentLang;
@OneToOne
@JoinColumn(name = "id_student")
private OeIvStudent idStudent;
@Column(name = "ln_code")
private String lnCode;
}
位置等级:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@Entity
@Table(name = "oe_locations")
public class OeLocations {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_location")
private Integer idLocation;
@OneToOne
@JoinColumn(name = "id_student", referencedColumnName = "id_student")
private OeIvStudentLang idStudent;
@Column(name = "code")
private String code;
}
我使用Serializable
接口的原因是我在OeLocations
中映射OeIvStudentLang
类的对象,但引用的列属于OeIvStudent
类。拥有OeIvStudentLang
的对象使我更容易在表格中穿梭,即
OeLocations
->OeIvStudentLang
->OeIvStudent
如果我在OeIvStudentLang
类中不使用Serializable
,Hibernate会抛出一个Exception
,说当我与OeLocations
类一起工作时,OeIvStudentLang
是不Serializable
的。如果我改用OeIvStudent
对象,我将无法从OeLocations
导航到 lang 类。
请看一看并建议该怎么做。
谢谢:)
这与实现Serializable
没有任何关系。
您已将OeIvStudentLang
和OeIvStudent
之间的关系定义为@OneToOne
。这意味着每个OeIvStudentLang
只有一个OeIvStudent
。正如您甚至所说,这应该是一对多关系,因此您需要将映射从@OneToOne
更改为@OneToMany
,并且它应该删除此唯一约束。
供参考:
一对一关联类似于具有 差异,该列将设置为唯一。
我怀疑,问题不在于 H2,而在于子实体中引用的(可能缺乏(定义。 你能告诉我们定义实体的线条吗?
可能 如何引用父母 ID-in-a-childs-id-with-JPA-Hibernate
可以提供帮助
您必须将其映射为@OneToMany关系并将id_student
列更改为集合实体