Может кто-нибудь объяснить 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);
    }
}

EDIT:

схемы базы данных:

AirlineFlights имеет idAirline как ForeignKey и авиакомпания не имеет idAirlineFlights. Эта марка, AirlineFlights как владелец / идентифицирующее лицо ?

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

5 143

5 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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