AnnotationException: внешний ключ, ссылающийся на dayHibernate ... неправильный номер столбца.должно быть 3 - PullRequest
0 голосов
/ 04 января 2019

Я хочу получить данные от стандартных сотрудников БД MySQL только из двух таблиц:

EMPLOYEES {
   EMP_NO, -- PK
   BIRTH_DATE,
   ....
}

TITLES {
   EMP_NO, -- PK, and FK to EMPLOYEES
   TITLE, -- PK
   FROM_DATE, -- PK
   TO_DATE,
   ....
}

Это ключ многих столбцов:

@Embeddable
public class TitleId implements Serializable {
    @Column(name = "emp_no")
    private long empNumber;

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

    @Column(name = "from_date")
    private java.sql.Date fromDate;

// constructor, hascode, setter, getter
// ................

}

А есть сущности:

Первая сущность

@Entity(name = "Title")
@Table(name = "titles")
public class Title implements Serializable {

    @EmbeddedId
    private TitleId titleId;

    @Column(name = "to_date")
    private java.sql.Date toDate;

    @OneToMany(mappedBy = "title")
    private List<Employee> employees = new ArrayList<>();

// constructor, setter, getter

}

Вторая сущность

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

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @ManyToOne(optional = false)
    @JoinColumn(name = "emp_no", insertable = false, updatable = false)
    private Title title;

 //   setter, getter, constructor, other coluns
}

И EmployeeDao:

    List employees = session.createQuery("FROM Employee").list();
    for (Iterator iterator = employees.iterator(); iterator.hasNext();){
        Employee employee = (Employee) iterator.next();
        System.out.print("First Name: " + employee.getFirstName());
        System.out.print("  Last Name: " + employee.getLastName());
    }

И когда я пытаюсь получить эти ДАННЫЕ, появляетсяследующее исключение

AnnotationException: A Foreign key refering dayHibernate.Title from dayHibernate.Employee has the wrong number of column. should be 3

Как получить данные из этих двух таблиц и избежать исключения?помоги мне пожалуйста

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Добавление @JoinColumns в таблицу Employee

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

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @ManyToOne(optional = false)
      @JoinColumns ({
      @JoinColumn(name="emp_number", referencedColumnName = "emp_no"),
      @JoinColumn(name="title", referencedColumnName = "title"),
      @JoinColumn(name="from_date", referencedColumnName = "from_date")
    })
    private Title title;

 //   setter, getter, constructor, other coluns
}
0 голосов
/ 04 января 2019

Вы не можете использовать @JoinColumn с @ManyToOne при использовании Composite Key в указанном объекте.Исключение говорит само за себя: сотрудник пытается ссылаться на заголовок только с помощью emp_no, но у него есть еще два поля в составном ключе.

Я думаю, что в данном случае это проблема проектирования всей модели сущности.Поскольку TitleId содержит первичный ключ Employee, сущность Title не должна иметь отношения «Много к одному» с Employee, но у Employee должно быть много названий.

Поскольку Emp_no находится в составном ключе и является внешним ключом, вы должны иметь возможность использовать @MapsId, см., Например, этот пост .

Это работает для меня:

Сотрудник

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

    @Id
    @Column(name = "emp_no")
    private long empNo;

    @OneToMany(mappedBy="employee")
    private List<Title> titles = new ArrayList<>();

    ... }

TitleId

@Embeddable
public class TitleId implements Serializable {

    private static final long serialVersionUID = 1L;

    @Column(name = "emp_no")
    private long empNumber;

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

    @Column(name = "from_date")
    private java.sql.Date fromDate;
}

Должность

@Entity(name = "Title")
@Table(name = "titles")
public class Title implements Serializable {

    @EmbeddedId
    private TitleId titleId;

    @Column(name = "to_date")
    private java.sql.Date toDate;

    @MapsId("empNumber")
    @JoinColumn(name = "emp_no")
    @ManyToOne
    private Employee employee;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...