有人可以请解释映射在休眠? [英] Can someone please explain mappedBy in hibernate?

查看:106
本文介绍了有人可以请解释映射在休眠?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是hibernate的新手,需要使用一对多和多对一的关系。这是我的对象中的双向关系,所以我可以从任一方向进行遍历。 mappedBy 是推荐的方法,但是我无法理解它。有人可以向我解释:


  • 推荐使用它的方式是什么?

  • 什么目的是否解决?



为了我的例子,这里是我的注解类:


  • Airline 拥有许多 AirlineFlights

  • 许多 AirlineFlights 属于 ONE 航空公司



航空公司



  @Entity 
@Table(name =Airline)
公共类航空公司{
私人整数idAirline;
私人字符串名称;

私人字符串代码;

private String aliasName;
私人套餐< AirlineFlight> airlineFlights = new HashSet< AirlineFlight>(0);

公共航空公司(){}
$ b $公共航空公司(字符串名称,字符串代码,字符串别名,设置< AirlineFlight>航班){
setName(name);
setCode(code);
setAliasName(aliasName);
setAirlineFlights(flights);


@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name =IDAIRLINE,nullable = false)
public整数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)
公共类AirlineFlight {
private整数idAirlineFlight;
私人航空公司;
private String flightNumber;

公共AirlineFlight(){}

公共AirlineFlight(航空公司,字符串航班号){
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;

$ b @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name =IDAIRLINE,nullable = false)
public Airline getAirline(){
回程航空公司;
}
public void setAirline(航空公司){
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列。真的只有其中一个应该! '正常'的做法是从 @OneToMany 一边完全取消 @JoinColumn ,然后将mappedBy添加到 @OneToMany

  @OneToMany(cascade = CascadeType.ALL, mappedBy =航空公司)
公共集合< AirlineFlight> getAirlineFlights(){
return airlineFlights;
}

它告诉Hibernate查看名为'airline'的bean属性我有一个集合来查找配置。


I am new to hibernate and need to use one-to-many and many-to-one relations. It is a bi-directional relationship in my objects, so that I can traverse from either direction. mappedBy is the recommended way to go about it, however, I couldn't understand it. Can someone please explain to me :

  • what is the recommended way to use it ?
  • what purpose does it solve ?

For the sake of my example, here are my classes with annotations :

  • Airline OWNS many AirlineFlights
  • Many AirlineFlights belong to ONE Airline

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);
    }
}

EDIT:

Database schema:

AirlineFlights has the idAirline as ForeignKey and Airline has no idAirlineFlights. This makes, AirlineFlights as the owner/identifying entity ?

Theoretically, I would like airline to be the owner of airlineFlights.

解决方案

By specifying the @JoinColumn on both models you don't have a two way relationship. You have two one way relationships, and a very confusing mapping of it at that. You're telling both models that they "own" the IDAIRLINE column. Really only one of them actually should! The 'normal' thing is to take the @JoinColumn off of the @OneToMany side entirely, and instead add mappedBy to the @OneToMany.

@OneToMany(cascade = CascadeType.ALL, mappedBy="airline")
public Set<AirlineFlight> getAirlineFlights() {
    return airlineFlights;
}

That tells Hibernate "Go look over on the bean property named 'airline' on the thing I have a collection of to find the configuration."

这篇关于有人可以请解释映射在休眠?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆