Õ¾ÄÚËÑË÷: ÇëÊäÈëËÑË÷¹Ø¼ü´Ê

µ±Ç°Ò³Ãæ: ¿ª·¢×ÊÁÏÊ×Ò³ ¡ú Java רÌâ ¡ú EJB 3.0 ¿ª·¢Ö¸ÄÏ֮ʵÌåBean

EJB 3.0 ¿ª·¢Ö¸ÄÏ֮ʵÌåBean

ÕªÒª: ÔÚEJB3.0Öпª·¢ÊµÌåBean·Ç³£¼òµ¥£¬Äã¿ÉÒÔÏ󿪷¢Ò»°ãµÄjava beanÒ»Ñù±à³Ì£¬Ö»Ðè×öÉÙÁ¿µÄ×¢ÊÍ
¡¡¡¡ÔÚEJB3.0Öпª·¢ÊµÌåBean·Ç³£¼òµ¥£¬Äã¿ÉÒÔÏ󿪷¢Ò»°ãµÄjava beanÒ»Ñù±à³Ì£¬Ö»Ðè×öÉÙÁ¿µÄ×¢ÊÍ¡£Ò»¸öʵÌåbean²»ÐèҪʵÏÖHome½Ó¿Ú»òÕßRemote¡¢Local½Ó¿Ú¡£

¡¡¡¡ÊµÌåBeanͨ¹ýEntityManager²úÉú¡¢²éÕÒ¡¢ºÍ³Ö¾Ã²ã½áºÏ¡¢´Ó³Ö¾Ã²ãÊջصȲÙ×÷¡£

¡¡¡¡JBossµÄEJB3.0¼Ü¹¹ÔÚHibernateÖ®ÉÏ¡£

¡¡¡¡×¢ÊÍ:

¡¡¡¡@Entity£ºÈç¹ûÄãÒª½¨Á¢Ò»¸öʵÌåBeanµÄÀ࣬Äã±ØÐëÔÚÀàÉϼÓÉÏÕâ¸ö×¢ÊÍ£¬ÓÃÀ´¸æËßÈÝÆ÷Õâ¸öÀàÊÇʵÌåBean¡£Õâ¸öBeanµÄÖ÷¼üÓÉ@IdÖ¸¶¨¡£

¡¡¡¡Õâ¸ö×¢Ê͵ÄÉùÃ÷ÈçÏ£º

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>@Target(TYPE) @Retention(RUNTIME)

public @interface Entity {

String name() default "";

EntityType entityType() default CMP;

AccessType access() default PROPERTY;

int version() default 3;

}</td></tr></table>
¡¡¡¡nameÓÃÀ´Ö¸¶¨ÊµÌåBeanµÄÃû³Æ£¬È±Ê¡ºÍÀàÃûÏàͬ¡£

¡¡¡¡EntityTypeÓÃÀ´Ö¸¶¨´ËbeanÊÇÈÝÆ÷¹ÜÀíµÄ³Ö¾ÃʵÌåBean»¹ÊÇBean¹ÜÀíµÄ³Ö¾ÃʵÌåBean¡£¿ÉÒÔÊÇCMPºÍBMPÁ½ÖÖ·½Ê½¡£

¡¡¡¡AccessTypeÓÃÀ´Ö¸¶¨ÈÝÆ÷·ÃÎÊ´ËEJBµÄ³Ö¾Ã»¯Êý¾ÝµÄ·½Ê½¡£PROPERTYÓÃÀ´¸æËßÈÝÆ÷ʹÓÃget/set·ÃÎʳ־û¯µÄÊý¾Ý£¨¾ÍÊÇÎÞTransient×¢Ê͵ÄÊý¾Ý£©£¬FILED¸æËßÈÝÆ÷Ö±½Ó·ÃÎÊ×ֶΣ¬×Ö¶ÎÓ¦¸ÃÉùÃ÷³ÆprotectedÀàÐÍ¡£

¡¡¡¡ÎªÁËÌṩ¸øÆäËû»á»°BeanµÈ¿Í»§¶ËʹÓã¬Õâ¸öBeanӦʵÏÖSerializable½Ó¿Ú¡£

¡¡¡¡ÊµÌåBean±ØÐëÓÉÒ»¸öÎÞ²ÎÊýµÄ¹¹Ôì·½·¨¡£

¡¡¡¡¿É³Ö¾Ã»¯µÄÊôÐÔ°üÀ¨£ºjavaµÄ»ù±¾ÀàÐÍ(int,longµÈ)¡¢String¡¢BigInteger¡¢BigDecimal¡¢java.util.Date¡¢Calendar¡¢java.sql.Date¡¢java.sql.Time¡¢java.sql.Timestamp¡¢byte[]¡¢char[]¡¢ÆäËûʵÌåBeanÀàÐÍ¡¢ÆäËûʵÌåBeanµÄ¼¯ºÏ(Collection¡¢Set£¬²»Ö§³ÖList)¡£

¡¡¡¡@Table

¡¡¡¡ÓÃÀ´Ö¸¶¨´ËʵÌåBeanʹÓõÄÖ÷±í£¬ÓÐʱºò¿ÉÄÜÐèÒªÆäËûµÄ±í£¬²Î¿´ºóÃæµÄÕ½ڵĽéÉÜ¡£UniqueConstraint×¢ÊÍÓÃÀ´Ìí¼ÓÔ¼ÊøÌõ¼þ¡£

¡¡¡¡@Id

¡¡¡¡ÓÃÀ´Ö¸¶¨´ËʵÌåBeanµÄÖ÷¼ü¡£Ëü¿ÉÒÔÓжàÖÖÉú³É·½Ê½£º

¡¡¡¡¡¤TABLE£ºÈÝÆ÷Ö¸¶¨ÓõײãµÄÊý¾Ý±íÈ·±£Î¨Ò»¡£

¡¡¡¡¡¤SEQUENCE£ºÊ¹ÓÃÊý¾Ý¿âµÄSEQUENCEÁÐÀ´±£Ö¤Î¨Ò»

¡¡¡¡¡¤IDENTITY£ºÊ¹ÓÃÊý¾Ý¿âµÄINDENTITÁÐÀ´±£Ö¤Î¨Ò»

¡¡¡¡¡¤AUTO£ºÓÉÈÝÆ÷ÌôÑ¡Ò»¸öºÏÊʵķ½Ê½À´±£Ö¤Î¨Ò»

¡¡¡¡¡¤NONE£ºÈÝÆ÷²»¸ºÔðÖ÷¼üµÄÉú³É£¬Óɵ÷ÓóÌÐòÀ´Íê³É¡£

¡¡¡¡@OnetoMany

¡¡¡¡Á½¸öʵÌåBeanÖ®¼ä¿ÉÄÜÓÐÒ»¶Ô¶à¡¢¶à¶ÔÒ»¡¢Ò»¶ÔÒ»¡¢¶à¶Ô¶àµÄ¹Øϵ£¬ºóÃæÁ½¸ö¹ØϵÔÚºóÃæµÄÀý×ÓÖнéÉÜ¡£

¡¡¡¡±ÈÈçѧÉúºÍ¸÷¿Î·ÖÊýÖ®¼ä¾ÍÊÇÒ»¶Ô¶àµÄ¹Øϵ¡£

¡¡¡¡ÔÚEJB3.0ÖУ¬Ò»¶Ô¶àµÄ¹ØÁª±ØÐëÊÇË«ÏòµÄ£¬Ò²¾ÍÊÇ˵£¬±Ø¶¨Óи÷¶à¶ÔÒ»µÄ¹ØÁªºÍËü¶ÔÓ¦¡£

¡¡¡¡OnetoMany×¢ÊÍÉùÃ÷ÈçÏ£º

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface OneToMany {

String targetEntity() default "";

CascadeType[] cascade() default {};

FetchType fetch() default LAZY;

}</td></tr></table>
¡¡¡¡µ±ÎÒÃÇʹÓÃÕâ¸ö×¢ÊÍΪget·½·¨×¢ÊÍʱ£¬Èç¹ûʹÓÃJDK5.0µÄͨÓñà³Ì£¬·µ»Ø¼¯ºÏCollection<Ä¿±êʵÌåÀàÐÍ>£¬ÄÇô¾Í²»ÐèÒªÖ¸¶¨targetEntityµÄÀàÐÍ£¬·ñÔò·µ»ØÀàÐÍÉùÃ÷ΪÆÕͨµÄCollectionµÄ»°£¬¾Í±ØÐëÉùÃ÷targetEntityµÄÀàÐÍ¡£

¡¡¡¡CascadeTypeÖ¸¶¨Á˵±Õâ¸öʵÌåBeanн¨»òÕßMergeµÄʱºò£¬ÓëÖ®¹ØÁªµÄʵÌåÐèÒªÔõÑùµÄ´¦Àí£º

¡¡¡¡¡¤MERGE£ºµ±Ö÷ʵÌåBean±»mergeµÄʱºò¡¢¹ØÁªµÄʵÌåBeanÒ²±»merge

¡¡¡¡¡¤CREATE£ºµ±Ö÷ʵÌåBean±»createµÄʱºò¡¢¹ØÁªµÄʵÌåBeanÒ²±»create

¡¡¡¡¡¤REMOVE£ºµ±Ö÷ʵÌåBean±»evictµÄʱºò¡¢¹ØÁªµÄʵÌåBeanÒ²±»evict

¡¡¡¡¡¤ALL£º°üÀ¨ÒÔÉϵÄÇé¿ö

¡¡¡¡FetchTypeÖ¸¶¨´ÓÊý¾ÝÖжÁÈ¡µÄ·½Ê½:LAZY»¹ÊÇEAGER¡£LAZYÖ»Óе±µÚÒ»´Î·ÃÎʵÄʱºò£¬²Å´ÓÊý¾Ý¿âÖеõ½Ïà¹ØµÄʵÌåbean£¬EAGERÔòºÜ»ý¼«£¬Í¬Ö÷ʵÌåBeanһͬ²úÉú¡£

¡¡¡¡@ManytoOne

¡¡¡¡ÎÒÃÇÖªµÀÒ»¶Ô¶àµÄ¹ØÁªÊÇË«ÏòµÄ¡£ÔÚ¹ØÁªµÄʵÌåBeanÖбض¨ÉùÃ÷ÁËÓÉManyToOne×¢Ê͵ķ½·¨¡£

¡¡¡¡@JoinColumn

¡¡¡¡ÎÒÃÇÖªµÀÁ½¸öʵÌå¿ÉÒÔ¹ØÁª£¬µ«¶ÔÓ¦µ½TableÖÐÐèÒªÖ¸¶¨Ò»¸öÁÐ×÷ΪÍâ¼ü¡£¼ÙÈç²»Ö¸¶¨name£¬ÄÇôÈÏΪÖ÷±íÖеÄÁк͸½±íÖеÄÖ÷¼üÓÐÏàͬÃû³ÆµÄ×÷ΪÍâ¼ü¡£Èç¹û²»Ö¸¶¨referencedColumnName£¬ÔòÈÏΪÍâ¼ü¶ÔÓ¦¸±±íµÄÖ÷¼ü¡£

¡¡¡¡@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

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>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 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 = 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 getScores()
¡¡{
¡¡¡¡return scores;
¡¡}

¡¡public void setScores(Collection scores)
¡¡{
¡¡¡¡this.scores = scores;
¡¡}
}</td></tr></table>
¡¡¡¡Student.javaʵÏÖÁËStudentʵÌåBean£¬ËüÌṩѧÉúµÄ»ù±¾Çé¿öÒÔ¼°Ñ§ÉúµÄµÃ·ÖÇé¿ö£¬µÃ·ÖÊÇÁíÍâÒ»¸öʵÌåBean¡£StudentʵÌåBeanºÍScoreʵÌåBeanÊÇÒ»¶Ô¶àµÄ¹Øϵ£¬Õ¾ÔÚScoreµÄ½Ç¶È¿´ÊǶà¶ÔÒ»µÄ¹Øϵ¡£

¡¡¡¡ÊµÌåBeanÐèҪʹÓÃ@Entity×ö×¢ÊÍ£¬ÁíÍâËüÖ¸¶¨Õâ¸öʵÌåBeanÓë±íSTUDENT¶ÔÓ¦£¨Í¨¹ý×¢ÊÍ@Table(name = "STUDENT")£©£¬Äã¿ÉÒÔÔÚJBOSSµÄÊý¾Ý¿âÖп´µ½Õâ¸ö±í¡£

¡¡¡¡Score.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>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;
¡¡}
}</td></tr></table>
¡¡¡¡Õâ¸öʵÌåBean´æ·ÅѧÉúµÄ·ÖÊý¡£

¡¡¡¡Teacher.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>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 map);
¡¡public Student getStudent();

¡¡@Remove

¡¡public void leave();
}</td></tr></table>
¡¡¡¡Õâ¸ö»á»°Bean½Ó¿ÚÌṩÔö¼Ó·ÖÊýºÍµÃµ½Óû§µÄ·½·¨¡£

¡¡¡¡TeacherBean.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>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 map)
¡¡{
¡¡¡¡if (student == null)
¡¡¡¡{
¡¡¡¡¡¡student = new Student();
¡¡¡¡}
¡¡¡¡student.setName(studentName);
¡¡¡¡Set set = map.keySet();
¡¡¡¡for (String sname:set)
¡¡¡¡{
¡¡¡¡¡¡student.addScores(sname,map.get(sname).intValue());
¡¡¡¡}
¡¡}

¡¡@Remove
¡¡public void leave()
¡¡{
¡¡¡¡manager.create(student);
¡¡}
}</td></tr></table>
¡¡¡¡Õâ¸öÊǻỰBeanµÄʵÏÖÀà¡£

¡¡¡¡Client.java

<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1> <tr> <td>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 map = new HashMap();
¡¡¡¡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 c = student.getScores();

¡¡¡¡for (Score score:c)
¡¡¡¡{
¡¡¡¡¡¡System.out.printf("%s:%s%n",score.getName(),score.getNumber()+"");
¡¡¡¡}
¡¡}
}</td></tr></table>
¡¡¡¡Õâ¸ö¿Í»§¶ËÔö¼ÓѧÉúµÄ·ÖÊý£¬²¢ÇÒ²âÊÔÏÔʾÕâ¸öѧÉúµÄÏà¹ØÐÅÏ¢¡£

¡¡¡¡ÇëÔËÐÐ{$JBOSS_HOME}/binĿ¼ÏµÄrun.bat: run ¨Cc all,Æô¶¯JBOSS¡£

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¡£



¡ü·µ»ØĿ¼
ǰһƪ: EJB 3.0 ¿ª·¢Ö¸ÄÏÖ®ÒÀÀµÖµ¶ÔÏó
ºóһƪ: ÉîÈë̽Ë÷CORBA¶ÔÏóÉúÃüÖÜÆÚÖ®¿®Êö