2017-02-21 31 views
0

Когда я пытаюсь получить отношения «Один-много» и «Много в один», у меня возникла проблема со столбцом соединения на табличке с транспортным средством. Почему hibernate ищет столбец USER_ID вместо того, чтобы присоединяться к нему? Я знаю цель присоединения, но когда я попытался использовать его с сопоставленным атрибутом By, я получил эту ошибку. Что не так с этим кодом?Hibernate mappedBy и @JoinColumn

Exception, что я получил:

Вызванный: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбца 'USER_ID' в 'списке полей'

Таблица пользователей:

@Entity 
@Table(name = "users") 
public class User { 

public User(){} 

public int getId() { 
    return id; 
} 

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

public String getFirst_name() { 
    return first_name; 
} 

public void setFirst_name(String first_name) { 
    this.first_name = first_name; 
} 

public int getSalary() { 
    return salary; 
} 

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

public String getLast_name() { 
    return last_name; 
} 

public void setLast_name(String last_name) { 
    this.last_name = last_name; 
} 

@Override 
public String toString() { 
    return "User{" + 
      "id=" + id + 
      ", first_name='" + first_name + '\'' + 
      ", salary=" + salary + 
      ", last_name=" + last_name + 
      '}'; 
} 

public Collection<Vehicle> getVehicles() { 
    return vehicles; 
} 

public void setVehicles(Collection<Vehicle> vehicles) { 
    this.vehicles = vehicles; 
} 

@OneToMany(mappedBy = "user") 
private Collection<Vehicle> vehicles = new ArrayList<>(); 

public Collection<Address> getAddresses() { 
    return addresses; 
} 
public void setAddresses(Collection<Address> addresses) { 
    this.addresses = addresses; 
} 

    @ElementCollection // for saving the collection or persist it to database 
    @JoinTable(joinColumns = @JoinColumn(name = "fk_user_id")) // will add to the fk created table renamed column "fk_user_id" 
    private Collection<Address> addresses = new ArrayList<>(); 

    @Id 
    @Column(name = "user_id") 
    private int id; 
    @Column(name = "first_name") 
    private String first_name; 
    @Column(name = "salary") 
    private int salary; 
    @Column(name = "last_name") 
    private String last_name; 
} 

Транспортное средство:

@Entity 
@Table(name = "vehicle") 
public class Vehicle { 

public User getUser() { 
    return user; 
} 

public void setUser(User user) { 
    this.user = user; 
} 

@ManyToOne 
@JoinColumn(name = "USER_ID") 
private User user; 

public int getVehicle_id() { 
    return vehicle_id; 
} 

public void setVehicle_id(int vehicle_id) { 
    this.vehicle_id = vehicle_id; 
} 

public String getVehicle_name() { 
    return vehicle_name; 
} 

public void setVehicle_name(String vehicle_name) { 
    this.vehicle_name = vehicle_name; 
} 

@Id 
private int vehicle_id; 
private String vehicle_name; 

} 
+0

В таблице вашего автомобиля есть столбец USER_ID? –

+0

Нет! vehicle_id и vehicle_name, @Join Column в основном переименовывает столбец существования? –

+0

Как я понимаю, он может присоединиться к столбцу таблицы и может переименовать его. У меня есть столбец user_id в таблице моих пользователей; –

ответ

1

Вы относитесь к @JoinColumn немного по-другому, что думаете.

Если у вас есть конфиг:

public class Vehicle { 

    @ManyToOne 
    @JoinColumn(name = "USER_ID") 
    private User user; 

Это говорит источник сохранения использовать VEHICLE.USER_ID колонку, когда VEHICLE и USERS таблицы соединены.

По умолчанию на стороне USERS таблицы, используется первичный ключ, который в данном случае представляет собой столбец с тем же именем: USERS.USER_ID (если не указано явно referencedColumnName свойство я @JoinColumn).

Суть в том, что вам нужно иметь столбец user_id в таблице ТРАНСПОРТНЫХ СРЕДСТВ.