簡體   English   中英

休眠一對一單向主鍵XML映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM