Unknown column in 'field list'. Hibernate
Есть 2 таблицы в mysql: Student(id, name, marks, comp_id) и Computer(cid, name). Программа должна сохранить Компьютеры и Студента в базу данных. Вот код:
Класс Student:
@Entity
public class Student {
@Id
private int id;
private String name;
private int marks;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "comp_id")
private List<Computer> computers;
public Student(int id, String name, int marks) {
this.id = id;
this.name = name;
this.marks = marks;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
public void setComputers(List<Computer> computers) {
this.computers = computers;
}
public List<Computer> getComputer() {
return computers;
}
}
Класс Computer:
@Entity
public class Computer {
@Id
private int cid;
private String cname;
public Computer(int cid, String cname) {
this.cid = cid;
this.cname = cname;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public String getName() {
return cname;
}
public void setName(String name) {
this.cname = name;
}
}
Класс App:
public class App
{
public static void main( String[] args ) throws SQLException {
StudentDAOImpl studService = new StudentDAOImpl();
Computer comp = new Computer(215, "Asus");
Student stud = new Student(8, "Karl", 90);
List<Computer> comps = new ArrayList<Computer>();
comps.add(comp);
stud.setComputers(comps);
studService.save(stud);
}
}
При выполнении программы выполняются следующие запросы и возникает ошибка:
Hibernate: insert into Student (marks, name, id) values (?, ?, ?)
Hibernate: insert into Computer (cname, cid) values (?, ?)
Hibernate: update Computer set comp_id=? where cid=?
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'comp_id' in 'field list'
По какой-то причине программа ищет поле comp_id в таблице Computer, а не Student. Если использовать @OneToOne вместо @OneToMany, то все нормально работает. Помогите исправить данную ошибку.
Ответы (1 шт):
Аннотация @JoinColumn указывает обязательную связь полей в конструкторах классов, при этом у вас нет поля @JoinColumn(name = "comp_id") в классе Computer и соответственно поля comp_id в одной из таблиц. В однонаправленных отношениях @OneToOne указывает JPA, что только одна из сторон является владельцем запросов и несёт ответственность за обновление связанных полей.