我在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?
答案 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;
}
其中flight
是Airline
实体中属性的名称。这将阻止hibernate在关系的两端生成外键列。
答案 1 :(得分:2)
您需要添加@JoinColumn注释以添加另一个用作航班外键的列
public class Airline {
..
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "flights_id", nullable = false)
Flight flight;
}