Отображение отношений между 3 сущностями в Hibernate - PullRequest
0 голосов
/ 27 июня 2011

Я пытаюсь справиться с hibernate и у меня возникла проблема при попытке сопоставить отношения между 3 объектами:

Например, у меня есть следующие классы:

Дистрибьютор (id, name), например: TNT, UPS, Fed Ex и каждый дистрибьютор имеет выбор ShippingMethod (идентификатор, имя, описание), например: супер экономия, международная ночевка, следующий день, и каждый метод доставки имеет ряд ShippingOption (идентификатор, имя, имя по умолчанию, активный, стоимость, доступность) и каждый из них зависит от конкретного дистрибьютора.

Для этого в БД у меня будет таблица для Distributor, таблица для ShippingMethods и таблица для ShippingOptions, которые будут иметь отношение FK к Distributor и ShippingMethods.

Однако в моей доменной модели я хотел бы иметь два класса - Distributor (), который будет содержать список классов ShippingOption (). ShippingOption () - это класс, объединенный как с ShippingMethod (), так и с ShippingOption () (для краткости я опускаю геттеры и т. Д. Ниже):

@Entity
@Table(name = "shipping_option")
public class ShippingOption {

    @Column(name = "is_active", nullable = false)
    private boolean isActive = false;
    @Column(name = "is_default", nullable = false)
    private boolean isDefault = false;
    @Column(name = "cost", nullable = false)
    private BigDecimal cost = BigDecimal.ZERO;

    private ShippingMethod shippingMethod = new ShippingMethod();

    public ShippingOption() {

    }

    public ShippingOption(boolean isDefault, BigDecimal cost, ShippingMethod shippingMethod) {
            setDefault(isDefault);
            cost(cost);    
    setShippingMethod(shippingMethod); 
    }

    public void setDefault(boolean isDefault) {

        this.isDefault = isDefault;
    }

    public void setShippingMethod(ShippingMethod shippingMethod) {

        this.shippingMethod = shippingMethod;
    }
}

Можно ли смоделировать это в Hibernate и как? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Не уверен, что это уместно, но я также использую Spring MVC 3.

Приветствия

Morris

1 Ответ

2 голосов
/ 27 июня 2011

Возможно объединение трех таблиц в спящем режиме. У меня была похожая проблема, когда (в вашем примере) ShippingOption имел отношение ManyToOne с Distributor и ShippingMethod.

Distributor (d_id, name)
ShippingMethod (sm_id, name, description)
ShippingOption (sp_id, d_id, sm_id, name, default, active, cost, availability, foreign key(d_id), foreign key(sm_id)) 

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

@Entity
@Table(name = "shipping_option")
public class ShippingOption {

  //..all other columns to retrive
  @JoinColumn(name = "d_id", referencedColumnName = "d_id")
  @ManyToOne
  private ShippingMethod shippingMethod

  @JoinColumn(name = "sm_id", referencedColumnName = "sm_id")
  @ManyToOne
  private Ditributor distributor; //Make sure you have Distributor and ShippingMethod Pojos defined


  public ShippingMethod getShippingMethod() {
      return this.shippingMethod;
  }

  public void setShippingMethod(ShippingMethod sMethod) {
      this.shippingMethod = sMethod;
  }

  // Getter setter for Distributor and other columns as well goes here.    
}

Мне нужно получить все данные о доставке данного имени Дистрибьютора. MySQL запрос будет что-то, связанное с этим

 select d.d_id, d.name, sm.name, so.name, so.default from Distributor as d, ShippingMethod as sm, ShippingOption as so where d.d_id = so.d_id and so.sm_id = so.sm_id and d.name = 'FedEx';

В реализации спящего режима,

   public List<ShippingOption> getAllShipingOptionByDistributor(final String distName) {

   //....
   return List<ShippingOption>  session.crateCriteria(ShippingOption.class)
  .createAlias("distributor", "distributor")     //distributor is the member of ShippingOption of type Distributor, see the above pojo definition.
  .add(Restrictions.eq("distributor.name", distName);
  .createAlias("shippingMethod", "sm")
  .list();

Вот так, я бы получил список ShippingOption, в котором каждый имел бы своего соответствующего Дистрибьютора и ShippingMethod.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...