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

EJB 3 開發指南(6):編寫第一個實體 Bean 程式完整流程

     編輯:Java 相關知識

實體 Bean 是 JPA 核心,代表資料表記錄與 Java 物件的映射。本文從零開始,完整示範:資料庫準備、JBoss 資料源配置、實體類別定義、persistence.xml 設定、Session Bean 操作 EntityManager、客戶端呼叫的端到端流程。

一、資料庫準備

建立測試表:t_users

id (PK) | name | password_md5
1       | bill | TaokQpoNJQb02eafO/JgYw==

二、JBoss 資料源配置

在 $JBOSS_HOME/server/default/deploy 建立 mysql-ds.xml:

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>MyPIM</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/pim</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>1234</password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
      <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

關鍵步驟:MySQL JDBC 驅動 JAR (mysql-connector-java-x.x.x.jar) 複製至 $JBOSS_HOME/server/default/lib。

三、實體 Bean 定義

package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_users")
public class User {
    private int id;
    private String name;
    private String password;

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

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Column(name = "password_md5")  // 欄位名映射
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

關鍵註解

  • @Entity:聲明為 JPA 實體
  • @Table(name="t_users"):指定映射資料表
  • @Id:主鍵欄位
  • @Column(name="password_md5"):屬性名與欄位名不同時映射

四、persistence.xml 配置

位於 META-INF/persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://java.sun.com/xml/ns/persistence"
             xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="https://java.sun.com/xml/ns/persistence
                                 https://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
  <persistence-unit name="myentity">
    <jta-data-source>java:/MyPIM</jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="none" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
    </properties>
  </persistence-unit>
</persistence>

關鍵配置

  • name="myentity":持久化單元名稱,與 @PersistenceContext(unitName="myentity") 對應
  • jta-data-source:引用 JBoss 資料源 JNDI 名稱
  • hibernate.dialect:指定資料庫方言,生成正確 SQL

五、Session Bean 操作 EntityManager

package service;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import entity.User;

@Stateless
public class UserBean implements UserBeanRemote {

    @PersistenceContext(unitName = "myentity")
    protected EntityManager em;

    @Override
    public String getPassword() {
        User user = em.find(User.class, 1);  // 根據 PK 查詢
        return user.getPassword();
    }
}

EntityManager 核心方法

六、遠端介面與客戶端呼叫

遠端介面:UserBeanRemote

@Remote
public interface UserBeanRemote {
    String getPassword();
}

客戶端程式碼

public class Client {
    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        props.setProperty(Context.PROVIDER_URL, "192.168.17.105:1099");

        InitialContext ctx = new InitialContext(props);
        UserBeanRemote bean = (UserBeanRemote) ctx.lookup("MyEnterprise/UserBean/remote");
        System.out.println(bean.getPassword());
    }
}

JNDI 命名規則

  • EAR 部署:耳名/Bean名/remote (如 MyEnterprise/UserBean/remote)
  • JAR 部署:Bean名/remote (如 UserBean/remote)

七、執行結果驗證

TaokQpoNJQb02eafO/JgYw==

成功從資料庫讀取 MD5 密碼並透過 EJB 遠端介面返回。

八、專案結構與部署

MyEJB.jar
├── entity/
│   └── User.class
├── service/
│   ├── UserBean.class
│   └── UserBeanRemote.class
└── META-INF/
    ├── MANIFEST.MF
    ├── persistence.xml
    └── jboss.xml (可選,指定 JNDI 名稱)

Eclipse 配置 JBoss Runtime 後,儲存檔案自動熱部署至 deploy 目錄。

九、常見問題排查

方法用途
find(Class, PK)根據主鍵查詢單筆,回傳實體或 null
persist(entity)新增實體 (INSERT)
merge(entity)更新/合併實體 (UPDATE/INSERT)
remove(entity)刪除實體 (DELETE)
createQuery(jpql)建立 JPQL 查詢
錯誤原因解決
NameNotFoundExceptionJNDI 名稱錯誤檢查 JBoss 控制台 JNDI 視圖確認實際綁定名稱
No Persistence providerpersistence.xml 路徑錯誤確認在 META-INF 根目錄,且 JAR 包含該檔案
Unknown entity實體類別未被掃描檢查 persistence.xml 是否包含實體類別或掃描配置
JDBC Driver not found驅動 JAR 未放入 lib複製 mysql-connector-java.jar 至 server/default/lib
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved