Может кто-нибудь объяснить mappedBy в спящем режиме?

Я новичок в спящем режиме и мне нужно использовать отношения один-ко-многим и многие-к-одному. Это двунаправленные отношения в моих объектах, так что я могу перемещаться в любом направлении. mappedBy - рекомендуемый способ сделать это, однако я не мог понять это. Может кто-нибудь объяснить:

  • Каков рекомендуемый способ его использования?
  • с какой целью это решает?

Ради моего примера, вот мои занятия с аннотациями:

  • 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 в качестве владельца/идентифицирующего лица?

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

enter image description here

Ответ 1

Указывая @JoinColumn на обеих моделях, вы не имеете двухсторонних отношений. У вас есть две односторонние отношения и очень запутанное отображение этого. Вы сообщаете обе модели, что они "владеют" столбцом IDAIRLINE. На самом деле только один из них на самом деле должен! "Нормальным" является полное удаление @JoinColumn стороны @OneToMany, а вместо этого добавление mappedBy в @OneToMany.

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

Это говорит о спящем режиме. "Посмотрите на свойство bean с именем" авиакомпания "на том, что у меня есть коллекция, чтобы найти конфигурацию".

Ответ 2

MappedBy сигнализирует о спящем режиме, что ключ для отношения находится на другой стороне.

Это означает, что, хотя вы связываете две таблицы вместе, только одна из этих таблиц имеет ограничение внешнего ключа для другого. MappedBy позволяет по-прежнему ссылаться на таблицу, не содержащую ограничение, на другую таблицу.

Ответ 3

mappedby он говорит сам за себя, он говорит hibernate не отображать это поле, все готово отображено этим полем [name = "field"].
поле находится в другом объекте (name of the variable in the class not the table in database).

Если вы этого не сделаете, Hibernate отобразит эти два отношения, поскольку это не то же самое отношение

поэтому мы должны сказать hibernate сделать отображение только в одну сторону и координировать между ними.

Ответ 4

mappedby = "объект объекта того же класса, созданного в другом классе"

Примечание. -Mapped может использоваться только в одном классе, потому что одна таблица должна содержать ограничение внешнего ключа. если сопоставленные могут быть применены с обеих сторон, тогда он удаляет внешний ключ из обеих таблиц и без внешнего ключа нет отношения b/w двух таблиц.

Примечание: - он может использоваться для следующих аннотаций: - 1. @OneTone 2. @OneToMany 3. @ManyToMany

Примечание --- Он не может использоваться для следующей аннотации: - 1. @ManyToOne

В одном-единственном: - выполнять на любой стороне отображения, но выполнять только с одной стороны. Он удалит дополнительный столбец ограничения внешнего ключа в таблице, на которой он применяется.

Например, Если мы применим сопоставление по классу Employee на объекте employee, то внешний ключ из таблицы Employee будет удален.

Ответ 5

Вы начали с сопоставления ManyToOne, тогда вы также сопоставляете OneToMany, а также для BiDirectional. Затем на стороне OneToMany (обычно это ваша родительская таблица/класс) вы должны указать "mappedBy" (сопоставление выполняется и в дочерней таблице/классе), поэтому hibernate не будет создавать таблицу отображения EXTRA в БД (например, TableName = parent_child).