【问题标题】:JUnit with H2 Database : Unique index or primary key violation when adding multilingual services for multiple dataJUnit with H2 Database:为多个数据添加多语言服务时唯一索引或主键冲突
【发布时间】:2017-12-22 21:19:07
【问题描述】:

在Hibernate创建数据库的过程中,它正在为oe_iv_student_lang表中的外键id_student添加一个唯一键约束,因为我们必须实现Serializable接口,这导致Hibernate不允许我们添加多个在其对应的子表中具有相同父外键的行。

我附上了sn-p以便更好地理解..

学生班:

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

如果我不在OeIvStudentLangclass 中使用Serializable,当我使用OeLocations 类时,Hibernate 会抛出一个ExceptionOeIvStudentLang 不是Serializable。如果我要使用一个对象OeIvStudent 的,我将无法从 OeLocations 导航到 lang 类。

请查看并提出建议。

谢谢:)

【问题讨论】:

  • 请分享您的映射注释或该关联的 xml 定义。
  • 如果您没有包含任何源代码,这不是一个有用的问题。仅根据两个数据库表的动画,无法判断您的代码哪里出错了。请更新您的问题以包含有关您的方法的更多信息,包括您的 Hibernate/JPA 表映射。
  • @ikettu 请查看。我也分享过。
  • @Ben 欢迎来到卡通!这里,是我的源代码。请查看并告诉我您的宝贵建议。
  • 澄清一下,在你提到oe_iv_student_lang的问题中,但代码中没有,你的意思是oe_student_lang,是吗?

标签: java hibernate junit h2 in-memory-database


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这与实现Serializable 无关。

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

    对于reference

    一对一关联类似于多对一关联 列将被设置为唯一的区别。

    【讨论】:

    • 即使您将该关系定义为@ManyToOne,它仍然会在该表上生成相同的唯一约束?
    • 是的,它正在创建。问题在于可序列化。如果我们删除这个 Serializable 它不会创建唯一的。但它在我的程序中给出了错误
    • 这……很奇怪。您将某些类标记为可序列化但有些没有?
    • 设置@JoinColumn(..., unique=false)怎么样?
    • @OneToOne 肯定是错误的(这并不是说没有涉及Serializable 的另一个问题)。 @Ben 指出的地方,以及从OeIvStudentOeCountries,你都有它,说每个学生都有一个独特的国家,没有一个国家有超过一个学生......不太可能是你的意图。检查您对关系的所有使用情况,以消除其中之一成为问题一部分的可能性。
    【解决方案3】:

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

    可能 how-to-reference-a-parents-id-in-a-childs-id-with-jpa-hibernate

    可以帮忙

    【讨论】:

    • 我已经分享了映射。如果您遇到任何问题,请告诉我。
    • 位置不应该引用学生语言中的主键吗?除了那里对 ManyToLang 的更改之外?还是应该引用学生?
    • 我们必须将它加入到id_student,因为学生语言表中有两个条目,不同的ln_code对应于字段ln_code的学生表或位置表,我们不知道要哪个字段通过将其引用到主键来引用。
    • 那么为什么不在 lang 实体中使用 location_id,去掉 ln_code 并提供 location.code 呢? onetoone 关系是 student_id,ln_code 而不是 student_id。所以最好将 location_id 放入 lang 实体中,并使用 referenceColumn location_id 定义位置关系。我认为在 Onetoone 关系中同时使用 name 和 referencedColumnName 是没有意义的。
    猜你喜欢
    • 2019-03-17
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多