gpt4 book ai didi

java - Hibernate 一对一单向主键 XML 映射

转载 作者:行者123 更新时间:2023-11-29 13:58:39 25 4
gpt4 key购买 nike

我正在尝试在 hibernate 中的两个表之间创建一对一的单向主键关系。我正在使用 xml 映射。以下是我的 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;
}
}

学生.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;
...
}

储物柜.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>

以下是我保存学生和储物柜对象的主要类。

公共(public)类 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 程序时,出现以下错误。

Caused by: org.postgresql.util.PSQLException: ERROR: insert or update on table "student"违反外键约束 "fk_fcwupt4ogu22gfes87gv8ctp4" 详细信息:键 (student_id)=(1) 不存在于表“locker”中。

在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
)

关于java - Hibernate 一对一单向主键 XML 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com