2015-05-26 3 views
1

я следующая БД:Hibernate много-к-одному, без внешнего ключа, но с обратным внешним ключом

CREATE TABLE car_owner (
    car_owner_id int(11) NOT NULL, 
    car_id_fk int(11) DEFAULT NULL, 
    PRIMARY KEY (car_owner_id), 
    KEY car_owner_car_fk_idx (car_id_fk), 
    CONSTRAINT car_owner_car_fk FOREIGN KEY (car_id_fk) REFERENCES car (car_id) ON DELETE NO ACTION ON UPDATE NO ACTION, 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 


CREATE TABLE car (
    car_id int(11) NOT NULL AUTO_INCREMENT, 
    car_type varchar(45) DEFAULT NULL, 
    car_plates varchar(25) DEFAULT NULL, 
    PRIMARY KEY (car_id), 
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; 

И В модели Java:

Для CarOwner у меня есть:

@Entity 
@Table(name="car_owner") 
@NamedQuery(name="CarOwner.findAll", query="SELECT co FROM CarOwner co") 
public class CarOwner implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name="car_owner_id") 
    private Integer carOwnerId; 
..... 

    //bi-directional many-to-one association to Car 
    @OneToMany(fetch = FetchType.EAGER) 
    @JoinColumn(name = "car_id_fk", referencedColumnName = "car_id") 
    private List<Car> cars; 

И для автомобилей:

@Entity 
@Table(name="car") 
@NamedQuery(name="Car.findAll", query="SELECT c FROM Car c") 
public class Car implements Serializable { 

    @Id 
    @GeneratedValue 
    @Column(name="car_id") 
    private Integer carId; 
...... 

    //bi-directional many-to-one association to car_owner 
    @ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name = "car_owner_id") 
    private CarOwner carOwner; 

Проблема в том, что Hibernate не может связывать таблицы и автоматически создает новые столбцы car_id и car_owner_id.

Может кто-нибудь помочь в поиске правильной комбинации в модели для надлежащего соотнесения таблиц.

ответ

1

@JoinColumn должно быть у владельца отношений (в одном для многих это большая сторона, которая считается владельцем).

Так что я буду изменить это в car

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name = "car_owner_id",insertable=false, updatable=false) 
private CarOwner carOwner; 

И это CarOwner

@OneToMany(fetch = FetchType.EAGER,mappedBy = "carOwner") 
private List<Car> cars; 

Как примечание стороны, я бы также не используя EAGER но не имеет ничего общего с вопросом.


Обе таблицы знающие друг о друге называется Двунаправленный relationship.This происходит, когда каждая таблица имеет ключ другой таблицы. Это то, что ожидает ваш Java-код. Однако ваши таблицы в базе данных имеют однонаправленное отношение. Значение одной таблицы знает о другом, но не обоим. Ваш car_owner знает о car из-за ключа foriegn CONSTRAINT car_owner_car_fk FOREIGN KEY, но ваш car не имеет ни малейшего представления о car_owner оба абсолютно допустимы.

Теперь проблема в том, что в вашем коде Java вы рассматриваете его как двунаправленную связь.

//bi-directional many-to-one association to car_owner 
@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name = "car_owner_id") 
private CarOwner carOwner; 

но автомобиль не car_owner_id почему вы лечения его двунаправленного отношения.

Теперь либо обновите базу данных, чтобы сделать их би, либо измените код Java.

+0

Я получаю это исключение: 'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбец 'car0_.car_owner_id' в 'списке поля' \t sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method)' – GingerHead

+0

потому, что в У факта 'car' нет столбца с именем' car_owner_id'. , , ничего не решено. , , – GingerHead

+0

Я не обращал достаточного внимания на SQL Ginger. Ну, тогда это не двунаправлено. Это основной недостаток. – Shahzeb