переходят из режима гибернации во множество сопоставлений для таблицы соединения с дополнительными столбцами, суррогатным ключом, дополнительным первичным ключом - PullRequest
2 голосов
/ 08 августа 2011

Мне трудно разрешить сопоставления сущностей (используя аннотации) для следующих сценариев (из устаревшей базы данных)

Сценарий 1:

Table A
  A_ID (PK)

Table B    
  B_ID (PK)

TABLE A_B    
  AB_ID (PK)    
  A_ID (FK)    
  B_ID (FK)    
  Created_DATE

Сценарий 2:

Table A    
  A_ID (PK)

Table B    
  B_ID (PK)

TABLE A_B    
  AB_ID (PK)    
  A_ID (PK)(FK)    
  Test_Date (PK)    
  B_ID (FK)    
  Created_DATE

Сценарий 3:

Table A
  A_ID (PK)             
  A2_ID (PK)

Table B    
  B_ID (PK)

TABLE A_B    
  A_ID (PK)(FK)    
  A2_ID (PK)(FK)    
  B_ID (PK)(FK)   
  Created_DATE

Может ли какой-то один вид отображать эти объекты в спящем режиме с использованием аннотаций ис объяснением, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 августа 2011
Table Products
  Product_Id(PK)
  Product_Name
  Price

Table Orders
  Order_Id(PK)
  Order_Date
  Total

Table Order_Products
  Order_Id(FK)(PK)
  Product_Id(FK)(PK)
  Quantity

 @Entity
  public class OrderProducts{

     @Embeddable
     public static class IdClass {

        @ManyToOne
        @JoinColumn(name = "Product_Id")
        private Products p;

        @ManyToOne
        @JoinColumn(name = "Order_Id")
        private Orders o;
   }

   @Id
   private IdClass id = new IdClass();
   private Integer quantity;
  }

  @Entity
  public class Products{
     @ID
     private Integer id;

     @OneToMany(mappedBy="id.p") // this is the tricky part 'id.p'
     Set<OrderProducts> ops = new Set<OrderProducts>();

   }

аналогично заказам.

0 голосов
/ 14 августа 2011

Я приведу вам аналогичный сценарий только для большей ясности:

Сценарий 1:

Table Products
   Product_Id(PK)
   Product_Name
   Price
Table Orders
   Order_Id(PK)
   Order_Date
   Total
Table Order_Products
   Order_Product_Id(PK) (Surrogate key)
   Order_Id(FK)
   Product_Id(FK)
   Quantity

В этой области у нас есть многие ко многимСоотношение между таблицами Orders и Products выглядит следующим образом:

  • Заказ имеет много продуктов.
  • Продукт может принадлежать многим заказам.

Когда мы сопоставляем отношение «многие ко многим», отображение файла Order_Products не будет содержать никакой реализации для этого отношения, оно будет выражаться двумя отображениями «многие ко многим» (два пакета или два набора из двух классов) вдве стороны отношения следующим образом:

Для Products.hbm:

<class name="Products" table="Products">
   <id name="Product_Id" column="Product_Id">
       <generator class="native"/>
   </id>
   <bag name="Orders" generic="true" table="Orders_Products">
      <key column="Product_Id"/>
      <many-to-many column="Add_Orders_Id" class="Orders"/>
   </bag>
...and other properties
</class>

Orders.hbm:

<class name="Orders" table="Orders">
   <id name="Order_Id" column="Order_Id">
       <generator class="native"/>
   </id>
   <bag name="Products" generic="true" table="Order_Products">
       <key column="Orders_Id"/> 
       <many-to-many column="Product_Id" class="Products"/>
   </bag>
...

Это означает, что Product_Id изТаблица Products имеет отношение многие ко многим с Order_Id в таблице Orders.

Обратите внимание, что таблица в сумке tag является таблицей сопоставления "многие ко многим", котораяпромежуточная точка отношения, и Order_Id внутри пакета - это FK в Order_Products, который относится к Products таблица.

Имена двух сумок - это имена двух коллекций в двух классах, представляющих отношения «многие ко многим» в классе «Продукты»:

    public virtual IList<Orders> Orders
    {
        get;
        set;
    }

ВOrders класс у вас есть список продуктов:

    public virtual IList<Products> Products
    {
        get;
        set;
    }

В Order_Products.hbm вам просто не нужно ничего делать для этого отношения, однако вам не нужно отображать таблицуOrder_Products, если он содержит только внешние ключи и не имеет дополнительных свойств, например, если у него нет свойства «Количество»:

  <class name="Order_Products" table="Order_Products">
    <id name="Order_Product_Id" column="Order_Product_Id">
      <generator class="native" />
    </id>
    <property name="Quantity" type="Decimal" column="Quantity" />
  </class> 

В других двух сценариях, я думаю, вы будете следовать тому же отображениюза исключением того, что вы будете использовать составной ключ (<composite-id>) для сопоставления дополнительного составного первичного ключа, но сопоставления будут одинаковыми.

Для двух других сценариев, честно говоря, я не пробовал сопоставлениесам составной идентификатор, но я думаю, что отношение будет таким же, и составной ключ не повлияет на отношение, однако команда Hibernate настоятельно не рекомендует использовать составной kэй.

Я просто проигнорировал много кода в отображениях xml просто для простоты.

...