本文为原创,如需转载,请注明作者和出处,谢谢!
上一篇:
eclipse + JBoss 5 + EJB3开发指南(6):编写第一个实体Bean程序
一对一映射是很常用的。在一般情况下,一个主表通过外键和从表形成一对一的关系。在EJB3中使用@OneToOne注释来映射。一对一关系除了使用外键进行关联外,也可以采用共享主键的方式连接两个表。先看看如下两个表的结构:
图1 t_customers
图2 t_referees
t_customers和t_referees表形成了一对一的关系。t_customers表通过referee_id与t_referees表相连。与t_customers表对应的实体Bean的代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packageentity;
importjava.util.Collection;
importjavax.persistence.Entity;
importjavax.persistence.FetchType;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.OneToOne;
importjavax.persistence.Table;
@Entity
@Table(name="t_customers")
publicclassCustomer
{
privateintid;
privateStringname;
privateRefereereferee;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
publicintgetId()
{
returnid;
}
publicvoidsetId(intid)
{
this.id=id;
}
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
@OneToOne
publicRefereegetReferee()
{
returnreferee;
}
publicvoidsetReferee(Refereereferee)
{
this.referee=referee;
}
}
从上面的代码可以看出,getReferee方法使用了@OneToOne进行设置。在装载Customer对象的同时,Referee对象会被同时装载,而默认的外键字段就是Customer类中的referee属性名 + "_" + id,也就是referee_id。下面看一下与t_referees表对应的实体Bean代码:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->packageentity;
importjavax.persistence.Entity;
importjavax.persistence.GeneratedValue;
importjavax.persistence.GenerationType;
importjavax.persistence.Id;
importjavax.persistence.JoinColumn;
importjavax.persistence.OneToOne;
importjavax.persistence.Table;
@Entity
@Table(name="t_referees")
publicclassReferee
{
privateintid;
privateStringname;
privateCustomercustomer;
@OneToOne(mappedBy="referee")
publicCustomergetCustomer()
{
returncustomer;
}
publicvoidsetCustomer(Customercustomer)
{
this.customer=customer;
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
publicintgetId()
{
returnid;
}
publicvoidsetId(intid)
{
this.id=id;
}
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
}
Referee类使用了customer属性映射了Customer对象,实际上,这是一个双向的one-to-one映射。这时,在Referee类的customer属性的getter方法的@OneToOne注释中,需要使用mappedBy属性来指定主表(Customer)中的映射从表的属性名(referee)。
我们可以使用下面的代码进行测试:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->System.out.println(em.find(Referee.class, 1).getCustomer().getName());
Customercustomer=newCustomer();
customer.setName("微软");
Refereereferee=newReferee();
referee.setName("赵军");
em.persist(referee);
customer.setReferee(referee);
em.persist(customer);
如果要覆盖默认的名键名,例如,外键名为referee1_id,可以两种方法使EJB3容器使用新的外键:
1. 修改Customer类中的referee属性的getter和setter方法为getReferee1和setReferee1,并将Referee类中mappedBy属性的值修改成referee1。
2. 使用@JoinColumn注释设置新的外键名,这种方法只需要修改Customer类的getReferee方法上面注释即可,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@OneToOne
@JoinColumn(name="referee1_id")
publicRefereegetReferee()
{
returnreferee;
}
one-to-one关系还可以共享主键,也就是一个表的主键的值依赖于另一个表的主键的值。因此,在这种情况下,就不再需要t_customers表中的referee_id字段了。由于t_referees表的id字段值依赖于t_customers表的id字段值,因此,需要将t_referees表中的id字段值的自增类型去掉。
在EJB3中使用@PrimaryKeyJoinColumn注释来实现主键的共享。首先需要修改Customer类的getReferee方法上方的注释,修改后的代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
publicRefereegetReferee()
{
returnreferee;
}
然后要修改Referee类中的getCustomer和getId方法上方的注释,修改后的代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@OneToOne
@PrimaryKeyJoinColumn
publicCustomergetCustomer()
{
returncustomer;
}
@Id
@GeneratedValue(generator="pkGenerator")
@GenericGenerator(name="pkGenerator",strategy="foreign",
parameters=@Parameter(name="property",value="customer"))
publicintgetId()
{
returnid;
}
其中@GenericGenerator注释表示这个id属性是外键,并且依赖于customer属性对应的实体Bean的id属性值(主键值)。
另外还要注意一点,由于t_referees表的id的自增类型已经去掉,而且该值依赖于t_customers表的id字段值,因此,就不能直接持久化Referee对象了,而在持久化Customer对象的同时,EJB3容器会自动将Referee持久化的。
下一篇:
eclipse + JBoss 5 + EJB3开发指南(8):实现Entity Bean的一对多(one-to-many)映射
国内最棒的Google Android技术社区(eoeandroid),欢迎访问!《银河系列原创教程》发布《Java Web开发速学宝典》出版,欢迎定购
分享到:
相关推荐
**JBOSS5**是一个开源的应用服务器,它实现了Java EE 5规范,包括对EJB3和JPA的支持。JBOSS5提供了一个运行环境,开发者可以在其中部署和运行EJB3应用。它包含了Web服务器、JMS(Java Message Service)、JTA(Java ...
5. **实战示例**:提供一个简单的EJB3应用程序实例,如用户管理系统,展示如何创建Bean、持久化实体、实现业务逻辑以及调用远程接口等步骤。 6. **测试与调试**:讨论如何使用JUnit测试EJB组件,以及在JBoss环境下...
【JBOSS6.0.0M4发布EJB3测试】是一个关于企业级Java应用服务器JBOSS的重要更新,其核心聚焦在EJB3(Enterprise JavaBeans 3.0)的测试支持。EJB3是Java EE 5规范的一部分,它引入了许多改进,旨在简化开发过程并提高...
+ 配置EJB集成开发环境——Eclipse+JBoss Tools插件 + EJB快速上手——HelloWorld入门实例 * 第4课:会话Bean(Session Bean)——发布JNDI服务 + 无状态会话Bean(Stateless Session Bean) + 有状态会话Bean...
- **实体Bean(Entity Beans)**:EJB 3.0中的实体Bean基于JPA(Java Persistence API),允许开发者直接操作数据库,提供了ORM(对象关系映射)功能。 - **会话Bean(Session Beans)**:分为无状态会话Bean(@...
EJB3引入了许多重大改进,简化了开发流程,降低了对开发者的要求,使得它在企业级应用开发中变得更为实用和流行。 在EJB3中,最重要的特性包括: 1. **注解驱动**:EJB3摒弃了EJB2.x中的XML配置,大量使用Java注解...
标题中的"ejb3.rar_EJB3 struts2_MyEclipse EJ_ejb strut jboss_jboss_struts2"表明这是一个关于企业级Java开发的项目,主要涉及到EJB(Enterprise JavaBeans)3.0、Struts2框架、MyEclipse集成开发环境以及JBoss...
- 创建一个简单的EJB3项目,并通过JBoss服务器运行它。这个例子应该包括基本的无状态会话Bean的创建和调用。 - 使用JBoss提供的工具和文档来指导这一过程。 **2.3 在独立的TOMCAT中调用EJB** - 配置TOMCAT使其能够...
EJB(Enterprise JavaBeans)是Java平台为企业级应用提供的组件模型,EJB3.0是其重要的一次更新,引入了许多简化开发过程的特性,特别是对实体Bean的支持,使之更接近于POJO(Plain Old Java Object),从而降低了...
- 创建EJB:定义一个实体bean,例如一个订单服务,通过@Entity注解声明为数据库映射对象,@Table指定对应的表名。 - 提供远程接口:通过@Local或@Remote注解定义接口,用于客户端调用。 - 实现业务逻辑:在bean类...
- 一对多及多对一映射。 - 一对一映射。 - 多对多映射。 8. **参数查询** - 命名参数查询。 - 位置参数查询。 - Date参数处理。 9. **EJB 3.0查询语言(EJB3QL)** - 大小写敏感性。 - 排序(order by)。 - ...
**EJB3.0开发入门 Step by Step** Enterprise JavaBeans(EJB)是...通过阅读"EJB3.0开发Entity.pdf"、"EJB3.0开发Session Bean.pdf"和"EJB3.0开发Message Driven Bean.pdf",你将能深入学习并掌握EJB3.0的相关知识。
- **一对多及多对一映射**:通过示例展示如何实现一对多和多对一的关系映射。 - **一对一映射**:通过示例展示一对一关系的映射方法。 - **多对多映射**:通过示例展示多对多关系的映射方法。 - **参数查询**: ...