EJB系列(四)-- Entity Bean

   上篇对EJB的会话Bean有了简单的了解,本篇为大家介绍一下实体Bean。

定义

   Entity Bean跟普通Java Bean无异,区别在于它们用ejb的Annotation进行了标记。实体Bean是管理持久化数据的一个对象,潜在使用一些相关的Java对象并且可以依靠主键被唯一识别。通过包括@Entity元注释来指定一个类是一个实体Bean。实体Bean表示来自数据库的持久化数据。

开发步骤

1、配置Jboss数据源

    1)从目录JBOSS_HOME\docs\examples\jca下找到相应的数据库数据源配置的模版文件(如:如果是MySQL数据库就拷贝mysql-ds.xml)

    2)拷贝模版文件JBOSS_HOME\server\default\deploy目录下

    3)修改其中的用户名、密码、数据库主机、数据库名称等等属性

    4)拷贝数据库驱动到server\default\lib下

2、创建EJB Project项目

3、完善META-INF目录下创建persistence.xml文件

<?xml version="1.0"encoding="UTF-8"?>

<persistence>

       <!--Name属性用于定义持久化内容的名称  -->

<persistence-unitname="test">

       <!-- Jta-data-source 用于指定实体Bean使用的数据源名称 -->

              <jta-data-source>java:/MySqlDS</jta-data-source>

              <properties>

                     <propertyname="hibernate.dialect"value="org.hibernate.dialect.MySQLDialect"/>

<!--自动输出schema创建DDL语句 -->

                     <propertyname="hibernate.hbm2ddl.auto" value="create"/>

                     <!--"hibernate.hbm2ddl.auto"的值,若为上文中的"create-drop",则在实体Bean发布及卸载时将自动创建及删除相应的数据库表。为了使以后实体Bean的改动能反应到数据库表,建议使用update,这样实体Bean添加一个属性时能同时在数据库表增加相应字段。  -->

              </properties>

       </persistence-unit>

</persistence>

4、开发实体类

     1)实体类必须要有默认无参构造器

     2)实体类必须定义@Id

     3)映射field还是property,由@Id的位置来决定

注解使用

@Entity   //用于类名前。表明他是pojo类

@Table(name=”t_person”)       //用于类名。t_person表示这个类对应的表名,可以不用写。

@Column(name=”name”,length=255, nullable=false)      //用于属性。name表示表中的字段名,若不写则字段名和属性名一样,length=255表示设置字段的长度,nullable=false表示非空

@Id //用于属性。表明表中的id,且要求一定要有ID

@Transient     //瞬态属性,不会持久化到数据库;实体类默认是映射的;属性上加上@Transient,将不会映射

//主键生成策略

@GeneratedValue  //用于id属性。指定需要框架自动产生主键

@GeneratedValue(generator=“hibernateuuidgenerator”):定义id的生成策略,定义生成器

@GenericGenerator(name="hibernateuuidgenerator",strategy="uuid")

@GenerateValue(strategy=GeneratonType.AUTO,generator=“generatorName”)   //标识id自动增长

关联映射

多对一关联映射

@Entity

Public class Company{

         @Id

         Privateint id;

         PrivateString name;

}


@Entity

Public class Employee{

         @Id

         Privateint id;

         PrivateString name;

         @ManyToOne          //在多的一端使用

         @JoinColumn(name=”CID”)   //定义关联字段名称

         PrivateCompany company;

}


一对一关联映射

主键关联

@Entity

Public class Customer{

       @Id

       Private int id;

       Private Stringname;

       @OneToOne

       @PrimaryKeyJoinColumn

       PrivateCustomerNo customerNo;

}

 

@Entity

Public class CustomerNo{

       @Id

       Private int id;

       Private Stringsn;

       @OneToOne(mappedBy=”customerNo”)

       Private Customercustomer;

}

 

外键关联

@Entity

Public class Customer{

       @Id

       Private int id;

       Private Stringname;

       @OneToOne

       @JoinColumn(name=”customerIdNoId”,unique=true)

       PrivateCustomerNo customerNo;

}

 

@Entity

Public class CustomerNo{

       @Id

       Private int id;

       Private Stringsn;

       @OneToOne(mappedBy=”customerNo”)

       Private Customercustomer;

}

一对多关联映射

一对多单向关联映射

@Entity

Public class Classes{

       @Id

       Private int id;

       Private Stringname;

 

       @OneToMany

       PrivateSet<Student> students;

}

 

@Entity

Public class Student{

       @Id

       @GenerateValue

       Private int id;

       Private Stringname;

}

 

一对多双向关联映射

@Entity

Public class Classes{

       @Id

       Private int id;

       Private Stringname;

 

       @OneToMany(mappedBy=”classes”)

       PrivateSet<Student> students;

}

 

@Entity

Public class Student{

       @Id

       @GenerateValue

       Private int id;

       Private Stringname;

 

       @ManyToOne

      Private Classes classes;

}

 

多对多关联映射

@Entity

Public class Role{

       @Id

       Private int id;

       Private Stringname;

 

       @ManyToMany

       @JoinTable(name=”t_role_staff”)

       PrivateSet<Staff> staffs;

}

 

@Entity

Public class Staff{

       @Id

       Private int id;

       Private Stringname;

 

       @ManyToMany(mappedBy=”staffs”)

       PrivateSet<Role> roles;

}

 

继承映射

单表继承策略

@Entity

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name=”animalType”)

@DiscriminatorValue(“A”)

Public class Animal implements Serializable{

       @Id

       @GeneratedValue

       Private int id;

       Private Stringname;

       Private Stringsex;

}

 

@Entity

@DiscriminatorValue(“B”)

Public class Bird extends Animal{

       Private intheight;

}

 

@Entity

@DiscriminatorValue(“P”)

Public class Pig extends Animal{

       Private intweight;

}

 

Join映射策略

   Joined策略:父类和子类都对应不同的表,子类中只存在其扩展的特殊的属性(不包括父类的属性)

修改父类的策略即可:

@Inheritance(strategy=InheritanceType.JOINED)

Table_Per_Class映射策略

    父类和子类都对应不同的表,子类中存在的所有属性(包括从父类继承下来的所有属性)

修改父类的策略即可:

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
EJB(Enterprise JavaBeans)中,Session Bean 和 Entity Bean 是两种不同类型的组件,用于实现不同的功能。 1. Session Bean(会话Bean): Session Bean 是用于处理业务逻辑的组件。它代表了一个特定的会话,可以执行一系列相关的操作。Session Bean 可以分为以下两种类型: - Stateless Session Bean(无状态会话Bean):它不保存客户端的状态信息,每个方法调用都是独立的。适用于无需保存客户端状态的业务逻辑。 - Stateful Session Bean(有状态会话Bean):它保存了客户端的状态信息,可以跟踪多个方法调用之间的状态。适用于需要保存客户端状态的业务逻辑。 2. Entity Bean(实体Bean): Entity Bean 用于表示业务领域中的实体对象,例如数据库表中的行。它们持久化到数据库中,并提供对这些实体对象的增删改查等操作。Entity Bean 可以分为以下两种类型: - Container-Managed Persistence(CMP):容器管理持久化。在 CMP 中,容器负责管理实体的持久化,开发人员只需定义实体类和相关的映射关系。 - Bean-Managed Persistence(BMP):Bean管理持久化。在 BMP 中,开发人员需要自己编写代码来控制实体的持久化和数据库访问。 区别和含义: - Session Bean 主要用于处理业务逻辑,不负责持久化数据,而 Entity Bean 用于表示实体对象,并负责将实体对象持久化到数据库中。 - Session Bean 可以是无状态或有状态的,而 Entity Bean 通常是有状态的,因为它们需要维护实体对象的状态和标识。 - Session Bean 的生命周期由客户端决定,而 Entity Bean 的生命周期由容器管理。 - CMP 提供了更简单的持久化解决方案,开发人员无需编写 SQL 或 JDBC 代码,而 BMP 需要开发人员手动管理数据库访问和事务。 需要注意的是,EJB 在 Java EE 6 版本之后已经进入了轻量级的 CDI(Contexts and Dependency Injection)时代,推荐使用 CDI 来管理会话和实体等组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值