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

EJB 3.0 實體 Bean 多表映射:@SecondaryTable 實戰指南

     編輯:關於JSP

EJB 3.0 允許單一實體 Bean 映射多張資料表,透過 @SecondaryTable 與 @SecondaryTables 註解實現。常見於字典表、擴展屬性表等場景。本文以「學生-性別字典表」為例完整演示。

核心註解

@SecondaryTable(
    name = "GENDER",                    // 次要表名
    catalog = "",                       // 目錄
    schema = "",                        // 模式
    join = @JoinColumn(name="GENDER_ID"), // 聯結欄位
    uniqueConstraints = {}              // 唯一約束
)

@SecondaryTables({
    @SecondaryTable(name = "TABLE1", join = @JoinColumn(name="ID1")),
    @SecondaryTable(name = "TABLE2", join = @JoinColumn(name="ID2"))
})

完整實體 Bean 範例

package com.kuaff.ejb3.secondary;

import javax.persistence.*;

@Entity
@Table(name = "STUDENT")
@SecondaryTables({
    @SecondaryTable(name = "GENDER", 
        join = @JoinColumn(name = "GENDER_ID"))
})
public class Student implements Serializable {

    private int id;
    private Name name;           // 內嵌值物件
    private String grade;
    private String email;
    private String gender;       // 映射到 GENDER 表

    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name = "first", column = @Column(name = "FIRST")),
        @AttributeOverride(name = "last", column = @Column(name = "LAST"))
    })
    public Name getName() { return name; }
    public void setName(Name name) { this.name = name; }

    @Column(name = "GRADE")
    public String getGrade() { return grade; }
    public void setGrade(String grade) { this.grade = grade; }

    @Column(name = "EMAIL")
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }

    // 關鍵:secondaryTable 指定次要表
    @Column(name = "gender", table = "GENDER")
    public String getGender() { return gender; }
    public void setGender(String gender) { this.gender = gender; }
}

值物件類別

@Embeddable
public class Name implements Serializable {
    private String first;
    private String last;
    // getter/setter 略
}

會話 Bean 與客戶端

DAO 介面

@Remote
public interface StudentDAO {
    int create(String first, String last, String grade, String email, String gender);
    List<Student> findAll();
    void evict(Student s);
}

客戶端測試

public class Client {
    public static void main(String[] args) throws NamingException {
        InitialContext ctx = new InitialContext();
        StudentDAO dao = (StudentDAO) ctx.lookup(StudentDAO.class.getName());
        
        dao.create("晁", "岳攀", "8", "smallnest@kuaff.com", "男");
        dao.create("朱", "立煥", "6", "zhuzhu@kuaff.com", "女");
        
        for (Student s : dao.findAll()) {
            System.out.printf("%s%s的性別:%s%n", 
                s.getName().getFirst(), s.getName().getLast(), s.getGender());
            dao.evict(s);
        }
    }
}

資料庫驗證

  1. 啟動 JBoss:run.bat -c all
  2. 開啟 HSQL 管理工具:https://localhost:8080/jmx-console/... 調用 startDatabaseManager()
  3. 查看 STUDENT 表與 GENDER 表資料關聯

關鍵要點

  • @SecondaryTable 的 join 屬性必須指定主鍵關聯欄位
  • 欄位層級用 @Column(table = "SECONDARY_TABLE") 指定映射目標表
  • 支援多個 @SecondaryTable 組合複雜映射
  • 內嵌值物件(@Embedded)配合 @AttributeOverride 映射同表多欄位
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved