Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA连接表和列?_Java_Hibernate_Jpa_Jakarta Ee - Fatal编程技术网

Java 如何使用JPA连接表和列?

Java 如何使用JPA连接表和列?,java,hibernate,jpa,jakarta-ee,Java,Hibernate,Jpa,Jakarta Ee,我有下一个代码: 当我想将一列联接到employee表时,联接成功!下面是代码的工作示例: Employee.class: @Entity @Table (name = "employee") public class Employee { public Employee(int id, String name, String lastname, double salary, String spec) { this.id = id; this.name = name;

我有下一个代码:

当我想将一列联接到employee表时,联接成功!下面是代码的工作示例:

Employee.class:

@Entity
@Table (name = "employee")
public class Employee {

public Employee(int id, String name, String lastname, double salary, String spec) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.specialization = spec;
    this.lastname = lastname;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public double getSalary() {
    return salary;
}

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setSalary(double salary) {
    this.salary = salary;
}

@Override
public String toString() {
    return "Employee{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", salary=" + salary +
            ", spec='" + specialization + '\'' +
            '}';
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

@Id
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@Column(name = "lastname")
private String lastname;

@Column(name = "salary")
private double salary;

@Column (name = "specialization")
private String specialization;

public Managers getManagers() {
    return manager;
}

public void setManagers(Managers manager) {
    this.manager = manager;
}

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "fk_from_managers_manager_id")
private Managers manager;

public Employee(){}
}
@Entity
@Table (name = "employee")
public class Employee {

public Employee(int id, String name, String lastname, double salary, String spec) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.specialization = spec;
    this.lastname = lastname;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public double getSalary() {
    return salary;
}

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setSalary(double salary) {
    this.salary = salary;
}

@Override
public String toString() {
    return "Employee{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", salary=" + salary +
            ", spec='" + specialization + '\'' +
            '}';
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

@Id
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@Column(name = "lastname")
private String lastname;

@Column(name = "salary")
private double salary;

@Column (name = "specialization")
private String specialization;

public Managers getManagers() {
    return manager;
}

public void setManagers(Managers manager) {
    this.manager = manager;
}

@OneToOne(cascade = {CascadeType.ALL})
@JoinTable(name = "managers" ,joinColumns = {@JoinColumn(name = "fk_from_managers_manager_id"), @JoinColumn(name = "name")})
private Managers manager;

public Employee(){}
}
经理级:

@Entity
@Table(name = "managers")
public class Managers {

public Managers(){}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public Managers(String lastname, String name) {
    this.lastname = lastname;
    this.name = name;
}

@Override
public String toString() {
    return "Managers{" +
            "lastname='" + lastname + '\'' +
            ", name='" + name + '\'' +
            ", id=" + id +
            '}';
}

@Column(name = "lastname")
private String lastname;

@Column(name = "name")
private String name;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "manager_id")
private int id;
}

当我想用多列连接表时,我得到了一个异常,代码如下:

Employee.class:

@Entity
@Table (name = "employee")
public class Employee {

public Employee(int id, String name, String lastname, double salary, String spec) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.specialization = spec;
    this.lastname = lastname;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public double getSalary() {
    return salary;
}

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setSalary(double salary) {
    this.salary = salary;
}

@Override
public String toString() {
    return "Employee{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", salary=" + salary +
            ", spec='" + specialization + '\'' +
            '}';
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

@Id
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@Column(name = "lastname")
private String lastname;

@Column(name = "salary")
private double salary;

@Column (name = "specialization")
private String specialization;

public Managers getManagers() {
    return manager;
}

public void setManagers(Managers manager) {
    this.manager = manager;
}

@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "fk_from_managers_manager_id")
private Managers manager;

public Employee(){}
}
@Entity
@Table (name = "employee")
public class Employee {

public Employee(int id, String name, String lastname, double salary, String spec) {
    this.id = id;
    this.name = name;
    this.salary = salary;
    this.specialization = spec;
    this.lastname = lastname;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public double getSalary() {
    return salary;
}

public void setId(int id) {
    this.id = id;
}

public void setName(String name) {
    this.name = name;
}

public void setSalary(double salary) {
    this.salary = salary;
}

@Override
public String toString() {
    return "Employee{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", salary=" + salary +
            ", spec='" + specialization + '\'' +
            '}';
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

@Id
@Column(name = "id")
private int id;

@Column(name = "name")
private String name;

@Column(name = "lastname")
private String lastname;

@Column(name = "salary")
private double salary;

@Column (name = "specialization")
private String specialization;

public Managers getManagers() {
    return manager;
}

public void setManagers(Managers manager) {
    this.manager = manager;
}

@OneToOne(cascade = {CascadeType.ALL})
@JoinTable(name = "managers" ,joinColumns = {@JoinColumn(name = "fk_from_managers_manager_id"), @JoinColumn(name = "name")})
private Managers manager;

public Employee(){}
}
例外情况:

Caused by: org.hibernate.AnnotationException: A Foreign key refering employee.Employee from employee.Employee has the wrong number of column. should be 1

无法理解外键的问题,在使用指定列连接表时,幕后发生了什么

可能是重复的好,这根本没有意义:1。我想一个经理管理不止一个员工,所以应该是多人管理。2.name列已由name字段映射,因此关联无法再次映射它。3.员工姓名不是经理外键的一部分。这只是员工的名字,为什么要用它来将关联映射到经理?4.管理器是由其ID唯一标识的,而不是由其ID+名称标识的,因此使用附加列作为联接列是无用的。我不知道你想要实现什么。FWIW“经理”应该被称为“经理”,因为它代表一个人。是的!我是表/实体之间关系的初学者。。