有人可以请解释映射在hibernate?
我是hibernate的新手,需要使用1-Many和Many-1的关系。 这是我的对象中的双向关系,所以我可以从任何一个方向进行遍历。 mappedBy是推荐的方法。 但是,我不明白这一点。 有人可以请给我解释一下,
- 推荐使用的方法是什么?
- 它解决了什么目的?
为了我的例子,这里是我的注释类:
-
Airline
许多Airline
- 许多
AirlineFlights
属于AirlineFlights
Airline
航空公司 :
@Entity @Table(name="Airline") public class Airline { private Integer idAirline; private String name; private String code; private String aliasName; private Set<AirlineFlight> airlineFlights = new HashSet<AirlineFlight>(0); public Airline(){} public Airline(String name, String code, String aliasName, Set<AirlineFlight> flights) { setName(name); setCode(code); setAliasName(aliasName); setAirlineFlights(flights); } @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="IDAIRLINE", nullable=false) public Integer getIdAirline() { return idAirline; } private void setIdAirline(Integer idAirline) { this.idAirline = idAirline; } @Column(name="NAME", nullable=false) public String getName() { return name; } public void setName(String name) { this.name = DAOUtil.convertToDBString(name); } @Column(name="CODE", nullable=false, length=3) public String getCode() { return code; } public void setCode(String code) { this.code = DAOUtil.convertToDBString(code); } @Column(name="ALIAS", nullable=true) public String getAliasName() { return aliasName; } public void setAliasName(String aliasName) { if(aliasName != null) this.aliasName = DAOUtil.convertToDBString(aliasName); } @OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL}) @JoinColumn(name="IDAIRLINE") public Set<AirlineFlight> getAirlineFlights() { return airlineFlights; } public void setAirlineFlights(Set<AirlineFlight> flights) { this.airlineFlights = flights; } }
AirlineFlights:
@Entity @Table(name="AirlineFlight") public class AirlineFlight { private Integer idAirlineFlight; private Airline airline; private String flightNumber; public AirlineFlight(){} public AirlineFlight(Airline airline, String flightNumber) { setAirline(airline); setFlightNumber(flightNumber); } @Id @GeneratedValue(generator="identity") @GenericGenerator(name="identity", strategy="identity") @Column(name="IDAIRLINEFLIGHT", nullable=false) public Integer getIdAirlineFlight() { return idAirlineFlight; } private void setIdAirlineFlight(Integer idAirlineFlight) { this.idAirlineFlight = idAirlineFlight; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="IDAIRLINE", nullable=false) public Airline getAirline() { return airline; } public void setAirline(Airline airline) { this.airline = airline; } @Column(name="FLIGHTNUMBER", nullable=false) public String getFlightNumber() { return flightNumber; } public void setFlightNumber(String flightNumber) { this.flightNumber = DAOUtil.convertToDBString(flightNumber); } }
编辑:
数据库模式:
AirlineFlights有idAirline作为ForeignKey,Airline没有idAirlineFlights。 这使得AirlineFlights作为所有者/识别实体?
理论上,我希望航空公司成为航空公司的所有者。
通过在两个模型上指定@JoinColumn
,你不需要双向关系。 你有两个单向的关系,在这个关系上有一个非常混乱的映射。 您告诉两个模型他们“拥有”IDAIRLINE列。 真的只有其中一个实际上应该! “正常”的@JoinColumn
是从@OneToMany
方面完全@OneToMany
@JoinColumn,而将mappedBy添加到@OneToMany
。
@OneToMany(cascade = CascadeType.ALL, mappedBy="airline") public Set<AirlineFlight> getAirlineFlights() { return airlineFlights; }
这就告诉Hibernate:“查看名为'airline'的bean属性,查看我收集的信息来查找configuration。
MappedBy信号hibernate,关系的关键是在另一边。
这意味着,尽pipe将两个表链接在一起,但只有其中一个表具有另一个表的外键约束。 MappedBy允许您仍然将不包含约束的表链接到另一个表。
映射它说话它自我告诉hibernate不映射这个字段它的所有已经映射的这个字段(名称=“字段”)字段是在另一个实体(variables名称的类中的variables,而不是在数据库中的表),如果你不要这样做,hibernate会映射这两个关系,因为它不是相同的关系,所以我们需要告诉hibernate只做一边的映射,并在它们之间进行协调
mappedby =“在另一个类中创build的相同类的实体的对象”
注:由于一个表必须包含外键约束,因此只能在一个类中使用。 如果通过映射可以应用在两边,那么它从两个表中删除外键和没有外键没有关系B / W两个表。
注意: – 可以用于以下注释: – 1. @ OneTone 2. @ OneToMany 3. @ ManyToMany
注—它不能用于以下注释: – 1. @ ManyToOne
一对一: – 在任何一边进行测绘,但只在一边进行。 它将删除应用了哪个类的表上额外的外键约束列。
例如。 如果我们将Employee类中的映射应用于employee对象,那么Employee表中的外键将被删除。
你从ManyToOne映射开始,然后你把OneToMany映射也用于双向的方式。 然后在OneToMany方面(通常是你的父表/类),你必须提到“mappedBy”(映射是由child table / class完成的),所以hibernate不会在DB中创buildEXTRA映射表(如TableName = parent_child)。