我试图使用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 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。
我的问题是,如何将病人的表主键映射到地址表中的外键?我相信我的错误是在我的数据库语法,但我不知道哪一部分是错误的。
发布于 2016-06-01 06:35:17
在您的地址表中,您的patient_id是主键。不能为同一个patient_id插入两个地址。尝试插入单个地址。
发布于 2018-08-26 15:51:55
在表地址中,您已经在列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));
https://stackoverflow.com/questions/37521559
复制相似问题