EJB 3の持続化


EJB 3の永続化機構はHibernateとよく似ている.
環境:
サーバ:JBOSS 5.0
データベース:MySQL 5.0
1.データソースの作成
まずjboss-5.0.0.GAserverdefaultdeployの下で、データベースに接続するためのデータソースを作成します.
XMLファイルを作成します.名前はmysql-ds.xmlです.その内容は次のとおりです.
<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/ejb3inaction</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>200596</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>

もちろん、データベースによって構成方法が異なります.具体的には、jboss-5.0.0.GAdocsexamplesjcaの対応するXMLファイルを参照してください.
MYSQLのJDBCドライバをjboss-5.0.0.GAserverdefaultlibにコピーする必要があります.
2.永続化ユニットの作成
src/META-INFディレクトリの下に、次のようなXMLファイルpersitence.xmlを作成します.
<?xml version="1.0"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
  <persistence-unit name="mysqlpersistence">
    <jta-data-source>java:/MySqlDS</jta-data-source>
    <properties>
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
     <property name="hibernate.jdbc.fetch_size" value="18"/>
     <property name="hibernate.jdbc.batch_size" value="10"/>
     <property name="hibernate.show_sql" value="true"/>
     <property name="hibernate.format_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

3.エンティティークラスを作成するには:
package com.entity;
import java.io.Serializable;

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

@Entity
@Table(name="userinfo")
public class UserInfo implements Serializable {

	private static final long serialVersionUID = -3200018567382795556L;
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer userId;
	@Column(name="user_name",length=32)
	private String username;
	@Column(name = "password",nullable=false)
	private String password;
	
	public Integer getUserId() {
		return userId;
	}	
	public String getUsername() {
		return username;
	}
	public void setUserId(Integer userId) {
		this.userId = userId;
	}
	public void setUsername(String username) {
		this.username = username;
	}	
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

注記@Column注記は、プロパティにもフィールドにも使用できます.次のように使用できます.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getUserId() {
		return userId;
	}

ただし、フィールドとプロパティでこの注記を同時に使用することはできません.つまり、
private Integer userId;
public Integer getUserId() {
		return userId;
	}

同時使用ただし、UserIdの注釈がgetUserId()に使用されている場合、他のフィールドはフィールドに使用できますが、実際に機能する属性の注釈、すなわちフィールドに関する注釈は無視されます.
4.SessionインタフェースとSession Beanクラスの確立
package com.dao;
import javax.ejb.Remote;
import com.entity.UserInfo;
@Remote
public interface IUserDao {
	UserInfo getUserInfo(int userId);
	void insertUser(UserInfo user);
}
package com.dao;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import com.entity.UserInfo;
@Stateless
public class UserDaoImp implements IUserDao{

	@PersistenceContext(unitName="mysqlpersistence") 
	EntityManager entityManager;
	public UserInfo getUserInfo(int userId) {
		UserInfo userInfo= entityManager.find(UserInfo.class, userId);
		return userInfo;
	}
	public void insertUser(UserInfo user) {
		entityManager.persist(user);
	}
}

5.エンティティBeanとSessionBean、およびMETA-INFフォルダをjarファイルにパッケージ化し、            jboss-5.0.0.GAserverdefaultdeploy、基本的にはいいです.
6.先のEJBが永続化できるかどうかをテストするため.
JNDIの検索に使用する属性ファイルをsrcの下に作成します.ファイル名はjndi.propertiesで、内容は以下の通りです.
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
次のようなテストクラスEjbPersistenceTest.javaを再構築します.
package test;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.dao.IUserDao;
import com.entity.UserInfo;

public class EjbPersistenceTest {

	public static void main(String[] args) throws NamingException {
		// TODO Auto-generated method stub
		Context initialContext = new InitialContext();
	IUserDao user = (IUserDao) initialContext.lookup("UserDaoImp/remote");
//       
		UserInfo userInfo = new UserInfo();
		userInfo.setUsername("javait");
		userInfo.setPassword("2008");
		user.insertUser(userInfo);
//   ID        
		UserInfo userInfo = user.getUserInfo(1);
		System.out.println("username="+userInfo.getUsername());
	}
}

通常、username=javaitと入力され、EJBの永続化プロセスが完了します.