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

EJB3 實體 Bean 多對多映射實作指南

     編輯:J2EE

關聯表設計

多對多關係需透過一張中間關聯表實現。本例中:

  • t_customers:客戶表
  • t_addresses:地址表
  • t_customers_addresses:關聯表,含 customer_id、address_id 兩個外鍵
t_addresses 表結構 t_customers_addresses 關聯表結構

實體 Bean 程式碼

Customer 端(關係維護端)

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

    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
    @JoinTable(
        name = "t_customers_addresses",
        joinColumns = @JoinColumn(name = "customer_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id")
    )
    private Collection<Address> addresses;

    // Getter/Setter 略...
}

Address 端(被維護端)

@Entity
@Table(name = "t_addresses")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String addressLine;
    private String country;
    private String postCode;

    @ManyToMany(mappedBy = "addresses")
    private Collection<Customer> customers;

    // Getter/Setter 略...
}

關鍵註解解析

  • @ManyToMany:宣告多對多關係。
  • @JoinTable:指定關聯表名稱與雙向外鍵對應關係。
  • mappedBy = "addresses":表示由 Customer 端維護關係,Address 端僅映射。
  • cascade = CascadeType.PERSIST:持久化 Customer 時自動級聯持久化關聯的 Address。

測試程式碼

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

List<Address> addresses = new ArrayList<>();
Address addr1 = new Address();
addr1.setAddressLine("address1");
addr1.setCountry("中國");
addr1.setPostCode("12345678");
addresses.add(addr1);

Address addr2 = new Address();
addr2.setAddressLine("address2");
addr2.setCountry("美國");
addr2.setPostCode("4321");
addresses.add(addr2);

customer.setAddresses(addresses);
em.persist(customer); // 級聯儲存關聯地址

注意事項

雙向關係時,建議在業務邏輯中同步維護兩端集合(如 customer.getAddresses().add(addr); addr.getCustomers().add(customer);),確保物件圖一致性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved