【问题标题】:Postgresql-Hibertnate duplicate key value violates unique constraintPostgresql-Hibertnate 重复键值违反唯一约束
【发布时间】:2016-09-28 00:59:19
【问题描述】:

我正在尝试使用 hibernate 和 postgresql 将集合映射到数据库中。

目标: 为集合手动创建数据库表,不要使用 hbm2ddl.auto 配置。

数据库表

  CREATE TABLE patients(
    patient_id BIGSERIAL NOT NULL,
    first_name VARCHAR(255) NOT NULL,
    last_name VARCHAR(255) NOT NULL,
    PRIMARY KEY(patient_id));

    CREATE TABLE address (
    patient_id BIGINT NOT NULL,
    city VARCHAR(255),
    province VARCHAR(255),
    PRIMARY KEY(patient_id),
    CONSTRAINT testcollection FOREIGN KEY(patient_id) REFERENCES patients(patient_id));

Java 代码 患者分类

@Entity
@Table(name = "patients")
public class Patient {

    @Id
    @GenericGenerator(name = "primaryIncrement", strategy = "increment")
    @GeneratedValue(generator = "primaryIncrement")
    @Column(name = "patient_id")
    private long patientID;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @ElementCollection
    @JoinTable(name="address", joinColumns=@JoinColumn(name = "patient_id"))
    private Collection<Address> listOfAddresses = new ArrayList<Address>();

(getter 和 setter 省略)

地址类

@Embeddable
public class Address {

    @Column(name = "city")
    private String city;

    @Column(name = "province")
    private String province;

HibernateServletTest 类

Configuration config = new Configuration();

        config.configure("hibernate.cfg.xml");

        SessionFactory sessionFactory = config.buildSessionFactory();

        Session session = sessionFactory.openSession();

        Transaction transaction = session.getTransaction();
        transaction.begin();

        Patient patient = new Patient();
        Address address = new Address();
        Address homeAddress = new Address();
        patient.setFirstName("Ron");
        patient.setLastName("Weasly");
        address.setCity("Diagon Alley");
        address.setProvince("london");
        homeAddress.setCity("Abbey Road");
        homeAddress.setProvince("Chelsea");
        patient.getListOfAddresses().add(address);
        patient.getListOfAddresses().add(homeAddress);

        session.save(patient);
        transaction.commit();
        session.close();

        System.out.println("Successfully Saved!");

运行代码时遇到异常

org.postgresql.util.PSQLException: 错误: 重复键值违反 唯一约束“address_pkey”详细信息:键 (patient_id)=(0) 已经存在了。

根据堆栈跟踪,地址数据库表使用了一个已经存在的 Patient_id。

我的问题是,如何将患者表的主键映射到地址表中的外键?我相信我的错误是在我的数据库语法中,但我不知道哪一部分是错误的。

【问题讨论】:

    标签: java hibernate postgresql hibernate-mapping


    【解决方案1】:

    在您的地址表中,您的 patient_id 是主键。您不能为同一个患者 ID 插入两个地址。尝试插入单个地址。

    【讨论】:

      【解决方案2】:

      在表地址中,您已在列 patient_id 上创建了主键约束。您不能有两个具有相同 Patient_id 的地址。 要解决此问题,请为 address_id 创建另一列,在 address_id 上创建主键约束并从列 patient_id(在表地址中)删除主键约束:

      CREATE TABLE address (
      address_id BIGINT NOT NULL,
      patient_id BIGINT NOT NULL,
      city VARCHAR(255),
      province VARCHAR(255),
      PRIMARY KEY(address_id),
      CONSTRAINT testcollection FOREIGN KEY(patient_id) REFERENCES patients(patient_id));
      

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 2011-10-17
        • 1970-01-01
        • 2016-10-24
        • 2014-08-18
        • 2017-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多