`
lbfhappy
  • 浏览: 83219 次
社区版块
存档分类
最新评论

EJB学习日记(10)

阅读更多
实体BEAN的七种关系之---------一对多单向
 One-to-Many Unidirectional Relationship

一对多单向最典型的应用莫过于人和电话的关系了,我们一个人可以有很多个电话,有时候还经常会换号码,我们可以既有小灵通也有手机,家里还有固定电话,这就是很典型的一对多关系,为什么要是单向的呢,因为电话的易变性,这个号码可能今天是你的,明天就可能是别人的了,并且现在买手机号码是不需要身份证的,所以从电话号码是不可能查到你的身份证了.并且电话号码也不应该和人绑定,一般我们都是问别人电话是多少,却比较少去问一个号码是谁的(这种情况也有,就是你收到陌生人的电话或短信的时候).那我们还是先看代码吧.

首先我们还是先要定义一个人的实体类
/*
 * Person.java
 * 
 * Created on 2007-9-15, 0:11:58
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package lbf.entitybean.test1;

import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

/**
 *
 * 
@author Admin
 
*/
@Entity
public class Person implements Serializable {
    
private IDCard idCard;
    
private static final long serialVersionUID = 1L;
    
private Long id;
    
private String name;
    
private String sex;
    
private int age;
    
private Address address;
    
    @OneToOne(cascade
=CascadeType.ALL,optional=true)
    
public Address getAddress() {
        
return address;
    }

    
public void setAddress(Address address) {
        
this.address = address;
    }
    @OneToMany(cascade
=CascadeType.ALL)
    @JoinColumn(name
="personID")
    
public List<Phone> getPhones() {
        
return phones;
    }

    
public void setPhones(List<Phone> phones) {
        
this.phones = phones;
    }
    
private List<Phone> phones;
    
public int getAge() {
        
return age;
    }

    
public void setAge(int age) {
        
this.age = age;
    }

    
public String getName() {
        
return name;
    }

    
public void setName(String name) {
        
this.name = name;
    }

    
public String getSex() {
        
return sex;
    }

    
public void setSex(String sex) {
        
this.sex = sex;
    }
    
public void setId(Long id) {
        
this.id = id;
    }

    @Id
    @GeneratedValue(strategy 
= GenerationType.AUTO)
    
public Long getId() {
        
return id;
    }

    @OneToOne(cascade
={CascadeType.ALL})
    
public IDCard getIdCard() {
        
return idCard;
    }

    
public void setIdCard(IDCard iDCard) {
        
this.idCard = iDCard;
    }


}


然后是电话的实体类

/*
 * Phone.java
 * 
 * Created on 2007-9-18, 17:23:28
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 
*/

package lbf.entitybean.test1;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

/**
 *
 * 
@author hadeslee
 
*/
@Entity
public class Phone implements Serializable {
    
private static final long serialVersionUID = 1L;
    
private Long id;
    
private String phoneNumber;

    
public String getPhoneNumber() {
        
return phoneNumber;
    }

    
public void setPhoneNumber(String phoneNumber) {
        
this.phoneNumber = phoneNumber;
    }
    
public void setId(Long id) {
        
this.id = id;
    }

    @Id
    @GeneratedValue(strategy 
= GenerationType.AUTO)
    
public Long getId() {
        
return id;
    }

}

我们可以在Person类里面发现如下注释

 @OneToMany(cascade=CascadeType.ALL)
    @JoinColumn(name="personID")
    public List<Phone> getPhones() {
        return phones;
    }


它代表是一对多,一是指类本身,多是指这个成员,也就是一个类可以对应多个成员.
在一对多里面,无论是单向还是双向,映射关系的维护端都是在多的那一方,也就是Phone那里,因为要在数据库面表现的话,也只有让Phone起一个指向Person的外键,不可能在Person里面指向Phone,这一点和一对一不一样,一对一可以在任意一方起一个外键指向对方.可是一对多却不行了.在这里@JoinColumn这个注释指的却是在Phone里面的外键的列的名字,它并不像在一对一里面的注释指的是自己表里面的外键列名.这一点要特别注意一下.
如果是一对多的双向关系,那么这个注释就要应用到多的那边去了,虽然注释还在Person类里面,但是它起的效果却是在Phone里面起一个叫personID的外键, 因为多的那边要有外键指向少的这边.

如果你不加    @JoinColumn(name="personID")这个注释的话,那么JBOSS就会自动帮你生成一张中间表,它负现Person和Phone表之间的联系.它将会做如下事情:
CREATE TABLE PERSON_PHONE
(
    PERSON_id 
INT,
 PHONE_id 
INT
);
ALTER TABLE PERSON_PHONE ADD CONSTRAINT person_phone_unique
   
UNIQUE (PHONE_id);

ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone
   
FOREIGN KEY (PERSON_id) REFERENCES PERSON (id);

ALTER TABLE PERSON_PHONE ADD CONSTRAINT personREFphone2
   
FOREIGN KEY (PHONE_id) REFERENCES PHONE (id);

所以我们最好还是指定一下,在Phone里面生成一个外键指向Person,看起来更好一些.

分享到:
评论
1 楼 hkongm 2008-11-28  
引用
在这里@JoinColumn这个注释指的却是在Phone里面的外键的列的名字,它并不像在一对一里面的注释指的是自己表里面的外键列名.这一点要特别注意一下.

不对吧?

相关推荐

    JSF(Java Server Faces)学习日记

    这个"JSF学习日记"的压缩包文件包含了一个作者在学习过程中创建的实例和所需的JSF库文件,这对于初学者或者希望深入理解JSF的人来说是非常有价值的资源。 JSF的核心概念包括以下几个方面: 1. **组件模型**:JSF...

    J2EE OA项目开发日记

    在本文中,我们将深入探讨一个基于J2EE的OA(办公自动化)项目开发的过程,以及在其中使用的关键技术和工具。...通过分享这些开发日记,作者不仅记录了自己的成长,也为其他开发者提供了一条学习和借鉴的道路。

    j2ee OA 开发日记

    总的来说,《J2EE OA 开发日记》是学习和理解J2EE在实际项目中的应用的一个宝贵资源,它涵盖了项目开发的各个环节,从理论到实践,为开发者提供了一条清晰的学习路径。通过阅读这份日记,开发者不仅能深化对J2EE技术...

    j2ee oa 项目开发日记

    总的来说,这个项目开发日记为读者提供了从理论到实践的全面指导,对于想要了解和学习J2EE环境下OA系统开发的人员来说,是一份宝贵的参考资料。通过阅读这份日记,读者可以了解到一个完整的J2EE项目从无到有,从设计...

    【J2EE OA】 项目开发日记.docx

    ### J2EE OA项目开发日记知识点汇总 #### 一、项目背景及技术栈 - **项目名称**: J2EE OA项目(以下简称J2EEOA) - **技术栈**: - Java EE (J2EE): 一种广泛使用的Java企业级开发框架。 - JBoss Application ...

    J2EE OA项目开发日记.rar

    这个开发日记可能详述了每个阶段的具体任务、遇到的问题、解决方案以及最佳实践,对于学习和理解J2EE开发流程具有很高的参考价值。通过阅读这份文档,开发者可以深入了解如何在实际项目中应用上述技术,提高自己的...

    程序员实习日记.docx

    【程序员实习日记】这篇文档记录了一位实习程序员在工作中的学习和体验,主要涉及了Java Web开发中的核心技术栈,包括Struts、Spring和Hibernate框架,以及数据库管理和MFC(Microsoft Foundation Classes)库的使用...

    j2EE架构师手册+J2EE OA 项目开发日记

    《J2EE架构师手册》和《J2EE OA项目开发日记》是两份非常重要的IT资源,专门针对Java企业级应用开发领域的高级技术人员,尤其是对J2EE架构师而言。这两份资料深入探讨了J2EE技术栈,以及在实际OA(办公自动化)项目...

    Java开发:J2EE OA 项目开发日记

    通过阅读这个"Java开发:J2EE OA 项目开发日记",开发者不仅可以学习到具体的编程技巧,还能了解到项目管理、团队协作、问题解决等方面的经验,这对于个人技能提升和实际项目开发有着极大的帮助。

    计算机实习日记 (2).pdf

    日记中还提到了学习Java编程相关的开源框架——Struts、Spring和Hibernate。这些框架是Java Web开发中的常用工具,它们分别负责不同的职责: 1. Struts是Model2设计模式的一个实现,属于MVC(模型-视图-控制器)...

    J2EE OA 项目开发日记简介

    在提供的文件中,"J2EE OA项目开发日记.doc"很可能记录了整个开发过程的详细日志,包括遇到的问题、解决方案、时间线和项目进度等,对于学习和理解J2EE OA项目的开发流程非常有帮助。而"99java.com.txt"可能是开发者...

    j2ee oa项目开发日记.rar_J2EE_J2EE 项目_数据库 人力资源_项目 文档_项目开发 文档

    通过阅读和学习这份《J2EE OA项目开发日记》,开发者不仅可以了解到一个真实的J2EE项目是如何运作的,还能提升在项目管理、需求分析、系统设计、数据库管理和团队协作等方面的能力。对于想进入企业级应用开发领域的...

    如何学习Java技术

    此外,《Enterprise JavaBeans》一书提供了关于企业级Java应用的重要知识,特别是对于那些希望掌握EJB框架的人来说。 #### 应用服务器的选择与学习 对于想要进行更深层次的企业级Java应用开发的开发者来说,选择...

    计算机软件员工作实习日记.pdf

    【知识点详解】 1. **Java Web开发框架**:实习日记提到了Struts、Spring和Hibernate,这是Java Web开发中常见的三大框架。...通过实习日记,我们可以看到一个软件员从理论学习到实践应用的过程,以及问题解决的思路。

    jsp学习笔记

    **JSP(Java Server Pages)**是Java平台上用于创建动态网页的一种技术,它结合了HTML、脚本语言(如JavaScript)和Java代码,使得开发者可以...通过阅读"JSP学习日记",你可以逐步了解这些概念,并通过实践提升技能。

    大二下--暑期见习作业(要求+code)-shang学堂

    6. **EJB(Enterprise JavaBeans)**:虽然现代JavaEE应用更多使用轻量级框架如Spring,但了解EJB的基本概念也是有益的,特别是Session Beans和Entity Beans。 7. **Web容器**:如Tomcat或Jetty,这些容器负责部署...

    java培训实习报告

    从语言的历史、基本语法、数据类型、控制结构到面向对象编程、异常处理、集合框架等核心概念,还包括了简单的IO流、线程和网络编程的介绍,对于初学者来说是一份非常全面的学习资料。通过实践项目,如分支流程控制的...

    (完整版)Java系统架构师面试题 (2).docx

    10. 假如要设计一个搜寻引擎 像Google那样只有两个页面,要求性能最大化,Web方面应当如何设计? 为了设计一个高性能的搜寻引擎,需要使用分布式架构、负载平衡、缓存机制等技术来实现。 11. 公司级应用有哪些特别...

    Java EE 开发包

    使用Java EE开发Web应用通常包括以下几个步骤:编写Java类(可能包括Servlet和EJB)、创建JSP页面、配置部署描述符(如web.xml)、打包成WAR文件,最后部署到Java EE容器上。 6. **其他组件**: 除了Servlet和JSP...

Global site tag (gtag.js) - Google Analytics