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

EJB3 一對一映射:外鍵關聯與共享主鍵兩種模式詳解

     編輯:J2EE

資料表結構

  • t_customers:客戶表,含 referee_id 外鍵
  • t_referees:推薦人表
t_customers 表結構 t_referees 表結構

模式一:外鍵關聯(預設)

Customer 端(關係擁有者)

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

    @OneToOne
    private Referee referee; // 預設外鍵欄位為 referee_id

    // Getter/Setter 略...
}

Referee 端(被維護端)

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

    @OneToOne(mappedBy = "referee")
    private Customer customer;

    // Getter/Setter 略...
}

自訂外鍵名稱

若外鍵非預設命名,可用 @JoinColumn 覆蓋:

@OneToOne
@JoinColumn(name = "referee1_id")
public Referee getReferee() { return referee; }

同時 Referee 端 mappedBy 需同步修改為 "referee1"。

模式二:共享主鍵

移除 t_customers.referee_id,令 t_referees.id 同時作為主鍵與外鍵,值依賴 Customer 主鍵。

Customer 端

@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
public Referee getReferee() { return referee; }

Referee 端

@OneToOne
@PrimaryKeyJoinColumn
public Customer getCustomer() { return customer; }

@Id
@GeneratedValue(generator = "pkGenerator")
@GenericGenerator(
    name = "pkGenerator",
    strategy = "foreign",
    parameters = @Parameter(name = "property", value = "customer")
)
public int getId() { return id; }

關鍵點:

  • @PrimaryKeyJoinColumn:宣告共享主鍵。
  • @GenericGenerator(strategy = "foreign"):指定主鍵來源為關聯實體的 customer 屬性。
  • Referee 不再自增,主鍵值由 Customer 指派,持久化時僅需 em.persist(customer),Referee 會級聯儲存。

測試程式碼

// 外鍵模式
Customer c = new Customer(); c.setName("微軟");
Referee r = new Referee(); r.setName("趙軍");
em.persist(r);
c.setReferee(r);
em.persist(c);

// 共享主鍵模式
Customer c2 = new Customer(); c2.setName("Google");
Referee r2 = new Referee(); r2.setName("李四");
c2.setReferee(r2);
em.persist(c2); // 單獨持久化 Customer 即可

選型建議

  • 外鍵模式:通用、直觀、支援雙向導航、不強制主鍵綁定。
  • 共享主鍵模式:強一致性要求、主鍵語義相同、不想額外儲存外鍵欄位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved