相关文章推荐
喝醉的爆米花  ·  IServiceCollection 介面 ...·  2 年前    · 
睿智的打火机  ·  基于spark的用户画像项目实战 - 简书·  2 年前    · 
爱跑步的野马  ·  用grep搜索文件并只输出部分行数·  2 年前    · 
Code  ›  重复键值违反唯一约束。开发者社区
数据库 session 唯一约束
https://cloud.tencent.com/developer/ask/sof/113287937
礼貌的消炎药
1 年前
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
提问
问 重复键值违反唯一约束。
Stack Overflow用户
提问于 2016-05-30 08:56:54
EN

我试图使用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 {
    @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 and 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: ERROR:重复键值违反了唯一约束"address_pkey“的详细信息: key (patient_id)=(0)已经存在。

基于堆栈跟踪,地址数据库表使用已经存在的patient_id。

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

2 4.2K 0 票数 1
EN
java
hibernate
postgresql
hibernate-mapping

回答 2

Stack Overflow用户

发布于 2016-06-01 06:35:17

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

票数 0
EN

Stack Overflow用户

发布于 2018-08-26 15:51:55

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

CREATE TABLE address (
 
推荐文章
喝醉的爆米花  ·  IServiceCollection 介面 (Microsoft.Extensions.DependencyInjection) | Microsoft Learn
2 年前
睿智的打火机  ·  基于spark的用户画像项目实战 - 简书
2 年前
爱跑步的野马  ·  用grep搜索文件并只输出部分行数
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号