当前位置:天才代写 > tutorial > JAVA 教程 > EJB 3.0开拓指南之利用实体Bean

EJB 3.0开拓指南之利用实体Bean

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:295

副标题#e#

在上面一个例子中,实体Bean的属性对应到数据表中的列,都是回收默认的配置。通过Column,你可觉得属性指定命据表中的列名。

Column的声明如下:

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column {
String name() default "";
boolean primaryKey() default false;
boolean unique() default false;
boolean nullable() default true;
boolean insertable() default true;
boolean updatable() default true;
String columnDefinition() default "";
String secondaryTable() default "";
int length() default 255;
int precision() default 0;
int scale() default 0;
boolean specified() default true; // For internal use only
}

EntityManager 是用来处理惩罚实体Bean的帮助类。它可以用来发生/删除耐久化的实体Bean,通过主键查找实体bean,通过查询语言来查询实体Bean。

下面是EntityManager接口的声明:

package javax.ejb;
import java.sql.Connection;
/**
* 用来和耐久化上下文交互的接口
*/
public interface EntityManager {
/**
* 使实体bean受耐久化打点
* @param entity
*/
public void create(Object entity);

/**
* 将给定的实体Bean的状态和耐久化上下文团结。雷同数据库的更新操纵。
* @param entity
* @return 被团结的实体实例
*/
public <T> T merge(T entity);
/**
* 删除实例
* @param entity
*/
public void remove(Object entity);
/**
* 按照主键查找.
* @param entityName
* @param primaryKey
* @return 查询实例
*/
public Object find(String entityName, Object primaryKey);
/**
* 按照主键查找
* @param primaryKey
* @return 查询实例
*/
public <T> T find(Class<T> entityClass, Object primaryKey);
/**
* 耐久化上下文与底层数据库的同步
*/
public void flush();
/**
* 执行一个EJBQL查询
* @param ejbqlString EJBQL查询语句
* @return the new query instance
*/
public Query createQuery(String ejbqlString);
/**
* 执行定名的查询
* @param name 预界说的查询名称
* @return 查询实例
*/
public Query createNamedQuery(String name);
/**
* 执行一个当地SQL查询语句
* @param sqlString 当地查询语句
* @return 返回查询实例
*/
public Query createNativeQuery(String sqlString);
/**
* 更新到数据库中
* @param entity
*/
public void refresh(Object entity);
/**
* 耐久化上下文中删除实体
* @param entity
*/
public void evict(Object entity);
/**
* 查抄当前上下文中是否包括此实体
* context.
* @param entity
* @return
*/
public boolean contains(Object entity);
}


#p#副标题#e#

@JoinColumns

用来指示切合主键,在后头的章节中先容。

这个例子主要有以下几个文件,这个例子主要实现了打点学生分数的成果。Student是一个实体Bean,打点学生的根基信息(姓名和各课分数),个中学生的分数又是一个实体Bean。TacherBean是一个无状态的会话Bean,用来挪用实体Bean。和前面的例子一样,我们照旧利用Client测试。

·Student.java:实体Bean。

·Score.java:实体Bean。

·Teacher.java:会话Bean的业务接口

·TeacherBean.java:会话Bean的实现类

·Client.java:测试EJB的客户端类。

·jndi.properties:jndi属性文件,提供会见jdni的根基设置属性。

·Build.xml:ant 设置文件,用以编译、宣布、测试、排除EJB。

下面针对每个文件的内容做一个先容。

Student.java

package com.kuaff.ejb3.entity;
import javax.ejb.CascadeType;
import javax.ejb.Entity;
import javax.ejb.FetchType;
import javax.ejb.GeneratorType;
import javax.ejb.Id;
import javax.ejb.JoinColumn;
import javax.ejb.OneToMany;
import javax.ejb.Table;
import java.util.ArrayList;
import java.util.Collection;
import java.io.Serializable;
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable
{
//主键
private int id;
//学生名
private String name;
//学生的分数
private Collection<Score> scores;
//主键自动发生
@Id(generate = GeneratorType.AUTO)
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;
}
public void addScores(String name,int number)
{
if (scores == null)
{
scores = new ArrayList<Score>();
}
Score score = new Score();
score.setName(name);
score.setNumber(number);
score.setStudent(this);
scores.add(score);
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "student_id")
public Collection<Score> getScores()
{
return scores;
}
public void setScores(Collection<Score> scores)
{
this.scores = scores;
}
}

#p#副标题#e#

#p#分页标题#e#

Student.java实现了Student实体Bean,它提供学生的根基环境以及学生的得分环境,得分是别的一个实体Bean。Student实体Bean和Score实体Bean是一对多的干系,站在Score的角度看是多对一的干系。

实体Bean需要利用@Entity做注释,别的它指定这个实体Bean与表STUDENT对应(通过注释@Table(name = "STUDENT")),你可以在JBOSS的数据库中看到这个表。

Score.java

package com.kuaff.ejb3.entity;
import java.io.Serializable;
import javax.ejb.Entity;
import javax.ejb.GeneratorType;
import javax.ejb.Id;
import javax.ejb.JoinColumn;
import javax.ejb.ManyToOne;
import javax.ejb.Table;
@Entity
@Table(name = "Score")
public class Score implements Serializable
{
private int id;
private String name;
private int number;
private Student student;
//主键自动发生
@Id(generate = GeneratorType.AUTO)
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;
}
public int getNumber()
{
return number;
}
public void setNumber(int number)
{
this.number = number;
}
@ManyToOne
@JoinColumn(name = "student_id")
public Student getStudent()
{
return student;
}
public void setStudent(Student student)
{
this.student = student;
}
}

这个实体Bean存放学生的分数。

Teacher.java

package com.kuaff.ejb3.entity;
import javax.ejb.Remote;
import javax.ejb.Remove;
import java.util.Map;
@Remote
public interface Teacher
{
public void addScore(String studentName,Map<String,Integer> map);
public Student getStudent();
@Remove
public void leave();
}

#p#副标题#e#

这个会话Bean接口提供增加分数和获得用户的要领。

TeacherBean.java

package com.kuaff.ejb3.entity;
import javax.ejb.EntityManager;
import javax.ejb.Inject;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import java.util.Map;
import java.util.Set;
@Stateful
public class TeacherBean implements Teacher
{
@Inject
private EntityManager manager;
private Student student;
public Student getStudent()
{
return student;
}
public void addScore(String studentName, Map<String,Integer> map)
{
if (student == null)
{
student = new Student();
}
student.setName(studentName);
Set<String> set = map.keySet();
for (String sname:set)
{
student.addScores(sname,map.get(sname).intValue());
}
}
@Remove
public void leave()
{
manager.create(student);
}
}

这个是会话Bean的实现类。

Client.java

package com.kuaff.ejb3.entity;
import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Client
{
public static void main(String[] args) throws NamingException
{
InitialContext ctx = new InitialContext();
Teacher teacher = (Teacher) ctx.lookup(Teacher.class.getName());
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("语文",new Integer(98));
map.put("化学",new Integer(149));
map.put("物理",new Integer(143));
teacher.addScore("smallnest",map);
Student student = teacher.getStudent();
String name = student.getName();
System.out.printf("显示%s的分数:%n",name);
Collection<Score> c = student.getScores();
for (Score score:c)
{
System.out.printf("%s:%s%n",score.getName(),score.getNumber()+"");
}
}
}

这个客户端增加学生的分数,而且测试显示这个学生的相关信息。

请运行{$JBOSS_HOME}/bin目次下的run.bat: run –c all,启动JBOSS。

#p#分页标题#e#

http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss%3Aservice%3DHypersonic%2Cdatabase%3DlocalDB,然后挪用startDatabaseManager()要领,打开HSQL打点东西打点数据库。

在Eclipse的Ant视图中执行ejbjar target。可能在呼吁行下,进入到此工程目次下,执行ant ejbjar,将编译打包宣布此EJB。

在Eclipse的Ant视图中执行run target。可能在呼吁行下,进入到此工程目次下,执行ant run,测试这个EJB。

 

    关键字:

天才代写-代写联系方式