首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

EJB3 一對多映射:雙向關聯與關聯表兩種實作方式

     編輯:J2EE

資料表結構

  • t_customers:客戶表(主表)
  • t_orders:訂單表(從表),含外鍵 customer_id 參考客戶表
t_orders 表結構

方式一:外鍵單向關聯(推薦)

Customer 端

@Entity
@Table(name = "t_customers")
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
    private Collection<Order> orders;

    // Getter/Setter 略...
}

Order 端(關係擁有者)

@Entity
@Table(name = "t_orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String productId;
    private int count;

    @ManyToOne
    @JoinColumn(name = "customer_id")
    private Customer customer;

    // Getter/Setter 略...
}

重點:

  • Order 端為關係擁有者,使用 @JoinColumn 指定外鍵欄位。
  • Customer 端使用 mappedBy = "customer" 宣告由對方維護。
  • cascade = CascadeType.ALL 確保客戶操作自動級聯至訂單。

方式二:使用關聯表

若不想在 t_orders 加外鍵,可引入關聯表 t_customers_orders:

t_customers_orders 關聯表結構

Customer 端修改

@OneToMany
@JoinTable(
    name = "t_customers_orders",
    joinColumns = @JoinColumn(name = "t_customers_id", referencedColumnName = "id"),
    inverseJoinColumns = @JoinColumn(name = "orders_id", referencedColumnName = "id")
)
public Collection<Order> getOrders() { return orders; }

此時 Order 實體不再需要 customer 欄位與對應的 Getter/Setter。

測試程式碼

Customer customer = new Customer();
customer.setName("微軟");

List<Order> orders = new ArrayList<>();
Order o1 = new Order(); o1.setProductId("1234"); o1.setCount(20); o1.setCustomer(customer);
Order o2 = new Order(); o2.setProductId("4321"); o2.setCount(12); o2.setCustomer(customer);
orders.add(o1); orders.add(o2);

customer.setOrders(orders);
em.persist(customer); // 級聯儲存訂單

關鍵差異比較

特性外鍵方式關聯表方式
資料庫結構從表含外鍵額外關聯表,從表無外鍵
實體設計雙向關聯,Order 有 customer 參考單向關聯,Order 無 customer 參考
適用場景標準一對多,需從 Order 導航至 Customer不想污染從表結構、或多對多語義
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved