23.4.2. Composite key example

  1. <class name="Customer">
  2. <id name="customerId"
  3. length="10">
  4. <generator class="assigned"/>
  5. </id>
  6. <property name="name" not-null="true" length="100"/>
  7. <property name="address" not-null="true" length="200"/>
  8. <list name="orders"
  9. inverse="true"
  10. cascade="save-update">
  11. <key column="customerId"/>
  12. <index column="orderNumber"/>
  13. <one-to-many class="Order"/>
  14. </list>
  15. </class>
  16. <class name="Order" table="CustomerOrder" lazy="true">
  17. <synchronize table="LineItem"/>
  18. <synchronize table="Product"/>
  19. <composite-id name="id"
  20. class="Order$Id">
  21. <key-property name="customerId" length="10"/>
  22. <key-property name="orderNumber"/>
  23. </composite-id>
  24. <property name="orderDate"
  25. type="calendar_date"
  26. not-null="true"/>
  27. <property name="total">
  28. <formula>
  29. ( select sum(li.quantity*p.price)
  30. from LineItem li, Product p
  31. where li.productId = p.productId
  32. and li.customerId = customerId
  33. and li.orderNumber = orderNumber )
  34. </formula>
  35. </property>
  36. <many-to-one name="customer"
  37. column="customerId"
  38. insert="false"
  39. update="false"
  40. not-null="true"/>
  41. <bag name="lineItems"
  42. fetch="join"
  43. inverse="true"
  44. cascade="save-update">
  45. <key>
  46. <column name="customerId"/>
  47. <column name="orderNumber"/>
  48. </key>
  49. <one-to-many class="LineItem"/>
  50. </bag>
  51. </class>
  52. <class name="LineItem">
  53. <composite-id name="id"
  54. class="LineItem$Id">
  55. <key-property name="customerId" length="10"/>
  56. <key-property name="orderNumber"/>
  57. <key-property name="productId" length="10"/>
  58. </composite-id>
  59. <property name="quantity"/>
  60. <many-to-one name="order"
  61. insert="false"
  62. update="false"
  63. not-null="true">
  64. <column name="customerId"/>
  65. <column name="orderNumber"/>
  66. </many-to-one>
  67. <many-to-one name="product"
  68. insert="false"
  69. update="false"
  70. not-null="true"
  71. column="productId"/>
  72. </class>
  73. <class name="Product">
  74. <synchronize table="LineItem"/>
  75. <id name="productId"
  76. length="10">
  77. <generator class="assigned"/>
  78. </id>
  79. <property name="description"
  80. not-null="true"
  81. length="200"/>
  82. <property name="price" length="3"/>
  83. <property name="numberAvailable"/>
  84. <property name="numberOrdered">
  85. <formula>
  86. ( select sum(li.quantity)
  87. from LineItem li
  88. where li.productId = productId )
  89. </formula>
  90. </property>
  91. </class>