Hbernate:带有级联启用的unideirection @onetoone

时间:2017-02-20 09:08:56

标签: java hibernate

我在Flight(Parent)和Airline(Child)之间有一对一的单向映射,下面是我的代码 -

public class Airline {
..
    @OneToOne(cascade=CascadeType.ALL)
    Flight flight;
}

航班没有Airline这个有id的引用,将其命名为getter和setter。

我坚持airline并启用级联。

    Flight flight= new Flight();
    flight.setName("flight2");

    Airline airline= new Airline();
    airline.setName("Air India");
    airline.setFlight(flight);

    Session session=sessionFactory.openSession();
    session.saveOrUpdate(airline);
    session.saveOrUpdate(flight);

这会引发异常MySQLSyntaxErrorException:'字段列表'中的未知列'flights_id'。所以我添加了@JoinColumn感谢答案。

修改----

但我做了一个没有mappedby的双向(即两个单向关联)并且没有在第二个表中应用@joinColumn,即

public class Airline {
        @JoinColumn("flight_ref_id")
        @OneToOne(cascade=CascadeType.ALL)
        Flight flight;
    }


public class Flight {
        @OneToOne(cascade=CascadeType.ALL)
        Airline airline;
    }

并且

    airline.setFlight(flight);
    flight.setAirLine(airline)
    Session session=sessionFactory.openSession();
    session.saveOrUpdate(airline);

现在没有例外,即使Flight.it中没有@joincolumn创建了列airline_id,为什么?

mysql> select * from Airline;
+----+-----------+---------------+
| id | name      | flight_ref_id |
+----+-----------+---------------+
|  1 | Air India |          NULL |
+----+-----------+---------------+
1 row in set (0.00 sec)

mysql> select * from Flight;
+----+--------+------------+
| id | name   | airline_id |
+----+--------+------------+
|  1 | Del-NJ |          1 |
+----+--------+------------+

在db flight_ref_id中是null.why?

2 个答案:

答案 0 :(得分:2)

您没有为db表指定连接列名称。假设airline表有一个名为flight_id的连接列,您应该使用@JoinColumn来指定名称 -

public class Airline {

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "flight_id")
    Flight flight;
}

修改

您需要在关系的一侧指定mappedBy,如下所示 -

public class Flight {
    @OneToOne(mappedBy = "flight")
    Airline airline;
}

其中flightAirline实体中属性的名称。这将阻止hibernate在关系的两端生成外键列。

答案 1 :(得分:2)

您需要添加@JoinColumn注释以添加另一个用作航班外键的列

public class Airline {
..
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "flights_id", nullable = false)
    Flight flight;
}