![](/img/trans.png)
[英]JPA / Hibernate unidirectional one-to-one mapping with shared primary key
[英]Hibernate One to One Unidirectional Primary key XML mapping
我正在嘗試在hibernate中的兩個表之間創建一對一的單向主鍵關系。我正在使用xml maaping。以下是我的Java POJO類及其各自的.hbm文件。
學生POJO班
public class Student {
private Long studentId;
private String name;
private Locker locker;
public Long getStudentId() {
return studentId;
}
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Locker getLocker() {
return locker;
}
public void setLocker(Locker locker) {
this.locker = locker;
}
}
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.avinash.dto.Student" table="STUDENT">
<id name="studentId" type="long" column="STUDENT_ID">
<generator class="native"></generator>
</id>
<property name="name" type="string">
<column name="NAME"></column>
</property>
<one-to-one name="locker" class="com.avinash.dto.Locker" cascade="all" constrained="true">
</one-to-one>
</class>
</hibernate-mapping>
儲物櫃POJO類
public class Locker {
private Long lockerId;
private String location;
...
}
Locker.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.avinash.dto.Locker" table="LOCKER">
<id name="lockerId" type="long" column="LOCKER_ID">
<generator class="native"></generator>
</id>
<property name="location" type="string">
<column name="LOCATION"></column>
</property>
</class>
</hibernate-mapping>
以下是我保存學生和儲物櫃對象的主要課程。
公共類OneToOneUnidirectionalPK {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionfactory().openSession();
session.beginTransaction();
Locker locker = new Locker();
locker.setLocation("320, Building 1, First Floor");
Student student = new Student();
student.setName("Avinash");
student.setLocker(locker);
Serializable id = session.save(student);
System.out.println("The id is " + id);
session.getTransaction().commit();
session.close();
HibernateUtil.shutdown();
}
當執行上述Java程序時,出現以下錯誤。
由以下原因引起:org.postgresql.util.PSQLException:錯誤:對表“ student”的插入或更新違反了外鍵約束“ fk_fcwupt4ogu22gfes87gv8ctp4”的詳細信息:表(locker)中不存在鍵(student_id)=(1)。
在postgresSQL中創建的表如下
CREATE TABLE student
(
student_id bigint NOT NULL,
name character varying(255),
CONSTRAINT student_pkey PRIMARY KEY (student_id),
CONSTRAINT fk_fcwupt4ogu22gfes87gv8ctp4 FOREIGN KEY (student_id)
REFERENCES locker (locker_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE locker
(
locker_id bigint NOT NULL,
location character varying(255),
CONSTRAINT locker_pkey PRIMARY KEY (locker_id)
)
為什么未在此處插入數據。 做錯了什么。 有人可以解釋一下。
我認為映射是正確的。 問題在於數據庫結構:
請按如下所示更改數據庫,然后嘗試:
CREATE TABLE student
(
student_id bigint NOT NULL,
name character varying(255),
**locker bigint NOT NULL,**
CONSTRAINT student_pkey PRIMARY KEY (student_id),
CONSTRAINT fk_fcwupt4ogu22gfes87gv8ctp4 FOREIGN KEY **(locker)**
REFERENCES locker (locker_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.