Elton's Blog

EJB3入门(4)实体Bean

by on 六.17, 2009, under Java

实体Bean就是跟数据库中某个表对应的一个类。 类的每个实例对应数据库的一行记录。如果用过hibernate的人一定很熟悉这个概念。这个就是所谓的ORM模型。Jboss就是使用的Hibernate来实现的。

假设数据库中有这样一个表

mysql 表结构

mysql 表结构


我们来写一个EJB应用,来把用户的密码得到。

先对Jboss做相关配置,便于读取数据库。
设置数据源
拷贝jboss安装目录下docs/jca中的mysql-ds.xml到default/deploy目录中,对其中的参数进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>ejb</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/ejb</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password></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的驱动拷贝到default/lib中
在源代码目录下的META-INF中建立配置文件persistence.xml,以便ejb项目可以使用jboss的数据源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<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="myentity">
        <jta-data-source>java:/ejb</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        </properties>
    </persistence-unit>
</persistence>

其中jta-data-source中java后面的值一定要跟jboss数据源的jndi-name一致

下面就可以开始写一个与上面的表对应的实体Bean了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package me.prosight.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="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 标记表明这是一个实体bean
@Table 标记声明数据库的表的名字,如果不声明,同类名
@Id 表明这个字段是主键
@Column 标记说明这个属性对应的数据库中的字段名,不声明则同属性名。

我们需要建立一个无状态的session bean来调用实体bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package me.prosight.service;
 
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
 
import me.prosight.entity.User;
 
/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class UserBean implements UserBeanRemote {
 
	@PersistenceContext(unitName="myentity")
	protected EntityManager em;
 
	public String getPassword() {
		User user = em.find(User.class, 1);
		return user.getPassword();
	}
 
}

其中PersistenceContext中的unitName一定要跟persistence.xml中的persistence-unit中的name一致

最后,再写个测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package me.prosight.client;
 
import javax.naming.InitialContext;
import javax.naming.NamingException;
 
import me.prosight.service.UserBeanRemote;
 
public class Client {
	public static void main(String[] args) throws NamingException {
		InitialContext ctx = new InitialContext();
		UserBeanRemote user = (UserBeanRemote)ctx.lookup("UserBean/remote");
 
		System.out.println(user.getPassword());
	}
 
}

部署好ejb后,再使用这个类测试,应该就可以得到数据库中的数据了。





:,

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit my friends!

A few highly recommended friends...