实体Bean就是跟数据库中某个表对应的一个类。 类的每个实例对应数据库的一行记录。如果用过hibernate的人一定很熟悉这个概念。这个就是所谓的ORM模型。Jboss就是使用的Hibernate来实现的。
假设数据库中有这样一个表 caption id=”attachment_66” align=”alignnone” width=”498” caption=”mysql 表结构”
/caption 我们来写一个EJB应用,来把用户的密码得到。
先对Jboss做相关配置,便于读取数据库。 设置数据源 拷贝jboss安装目录下docs/jca中的mysql-ds.xml到default/deploy目录中,对其中的参数进行修改
ejb
jdbc:mysql://localhost:3306/ejb
com.mysql.jdbc.Driver
root
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter
mySQL
再将mysql的驱动拷贝到default/lib中 在源代码目录下的META-INF中建立配置文件persistence.xml,以便ejb项目可以使用jboss的数据源
java:/ejb
其中jta-data-source中java后面的值一定要跟jboss数据源的jndi-name一致
下面就可以开始写一个与上面的表对应的实体Bean了
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
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一致
最后,再写个测试类
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后,再使用这个类测试,应该就可以得到数据库中的数据了。