带 H2 数据库的 JUnit:为多个数据添加多语言服务时唯一索引或主键冲突



在Hibernate创建数据库的过程中,它为表中id_studentoe_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没有任何关系。

您已将OeIvStudentLangOeIvStudent之间的关系定义为@OneToOne。这意味着每个OeIvStudentLang只有一个OeIvStudent。正如您甚至所说,这应该是一对多关系,因此您需要将映射从@OneToOne更改为@OneToMany,并且它应该删除此唯一约束。

供参考:

一对一关联类似于具有 差异,该列将设置为唯一。

我怀疑,问题不在于 H2,而在于子实体中引用的(可能缺乏(定义。 你能告诉我们定义实体的线条吗?

可能 如何引用父母 ID-in-a-childs-id-with-JPA-Hibernate

可以提供帮助

您必须将其映射为@OneToMany关系并将id_student列更改为集合实体

相关内容

  • 没有找到相关文章

最新更新