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)
还没有评论,来说两句吧...