EJB3入门(4)实体Bean
by Elton on 六.17, 2009, under Java
实体Bean就是跟数据库中某个表对应的一个类。 类的每个实例对应数据库的一行记录。如果用过hibernate的人一定很熟悉这个概念。这个就是所谓的ORM模型。Jboss就是使用的Hibernate来实现的。
假设数据库中有这样一个表
我们来写一个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后,再使用这个类测试,应该就可以得到数据库中的数据了。



