java - 通过 Hibernate 注解创建外键关系的问题

标签 java hibernate jpa orm hibernate-mapping

我有 2 类 Employee 和 Passport,然后我尝试使用注释创建主键和外键关系的一对一映射,但 Passport 表中没有发生外键关系。

这里Primary_Id是Employee表中的Emp_No,并且必须是Passport表中的外键。

下面我提供了 Employee 和 Passport 的 2 个 POJO 类以及从 Hibernate 生成的 SQL。

有人可以帮我解决我犯的错误吗?如有更多信息,请告诉我。

员工

package com.otr.hibernate;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;

/**
 *
 * @author SPAR
 */
@Entity
public class Employee implements Serializable {

    @Id
    private String emp_No;
    private String first_Name;
    private String second_Name;
    private String designation;


    public String getEmp_No() {
        return emp_No;
    }

    public void setEmp_No(String emp_No) {
        this.emp_No = emp_No;
    }

    public String getFirst_Name() {
        return first_Name;
    }

    public void setFirst_Name(String first_Name) {
        this.first_Name = first_Name;
    }

    public String getSecond_Name() {
        return second_Name;
    }

    public void setSecond_Name(String second_Name) {
        this.second_Name = second_Name;
    }

    public String getDesignation() {
        return designation;
    }

    public void setDesignation(String designation) {
        this.designation = designation;
    }

}

Passport.java

package com.otr.hibernate;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

/**
 *
 * @author SPAR
 */
@Entity
public class Passport implements Serializable {

    private String passport_No;

    @Id @GeneratedValue(generator = "foreign")
    @GenericGenerator(name= "foreign", strategy = "foreign", parameters = {@Parameter(value = "employee", name = "property")})
    private String emp_RN_No;

    @OneToOne (cascade = CascadeType.ALL)
    @JoinColumn(name = "emp_RN_No")
    private Employee employee;


   public String getPassport_No() {
        return passport_No;
    }

    public void setPassport_No(String passport_No) {
        this.passport_No = passport_No;
    }

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }

     public String getEmp_No() {
        return emp_No;
    }

    public void setEmp_RN_No(String emp_No) {
        this.emp_No = emp_No;
    }

}

hibernate 一代

Hibernate: create table Employee (emp_No varchar(255) not null, designation varchar(255), first_Name varchar(255), second_Name varchar(255), primary key (emp_No));

Hibernate: create table Passport (emp_No varchar(255) not null, passport_No varchar(255), primary key (emp_No));

最佳答案

您不需要 GenericGenerator 来执行此操作。有两种更简单的选择:

  1. 组合@Id和@OneToOne:

    @Id @OneToOne (cascade = CascadeType.ALL)
    @JoinColumn(name = "emp_RN_No")
    private Employee employee;
    

    确保删除之前的 @Id 属性emp_RN_No

  2. 使用@MapsId:

    @Id
    private String emp_RN_No;
    
    @MapsId @OneToOne
    @JoinColumn(name = "emp_RN_No")
    private Employee employee;
    

关于java - 通过 Hibernate 注解创建外键关系的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675597/

相关文章:

java - 如何修复 Kuali 启动错误无法解析占位符 'datasource.url'?

java - 使用查询参数处理 Spring-boot 过滤器

java - 使用 drawString() java 时会跳过 Color.White

java - 大矩阵的少量计算与小矩阵的大量计算

java - XML 文档结构必须在同一实体内开始和结束

java - session.save 不返回持久化对象,只返回标识符

java - 使用网络代理时 Hibernate 插入两次

java - JPA - 实体未持久化

java - 添加列到连接表?

java - CriteriaBuilder 没有方法 createCriteriaUpdate