TeamVO
package mangerTeam.vo;
import java.io.Serializable;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* 俱乐部实体
* @author 刘岩
*/
@Entity
@Table(name = "team")
public class TeamVO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = false)
private Integer id;
@Column(name = "teamName")
private String teamName;
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "teamVO")
private Set<PlayersVO> players;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public Set<PlayersVO> getPlayers() {
return players;
}
public void setPlayers(Set<PlayersVO> players) {
this.players = players;
}
}
|
在此类中注意如下片段
@OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.LAZY, mappedBy = "teamVO")
private Set<PlayersVO> players;
|
即是声明和运动员一对多的关系
cascade = CascadeType.REFRESH:级联更新,当俱乐部信息更新的时候相应俱乐部中的运动员也更新,当俱乐部被删除的时候,不能把运动员也从数据库中删除了吧,所以这里只是REFRESH的时候才会级练到运动员,其他的操作不必理睬运动员。
mappedBy = "teamVO":表示teamVO在双方关系中属于被维护的一方,那么PlayersVO就是维护方,那么造成一个后果就是只能PlayersVO去更新外键,PlayersVO与TeamVO之间的外键关联关系是PlayersVO说了算的。结合实际就是,“宁教老子负公司,休教公司负老子”,老子不爽了可以走人、你公司不爽老子还得继续忍着吧……
具体业务代码和N VS M的差不多,在此不再赘述。
1. 1 VS 1映射总结
一对一的映射模型如下描述:
一个商品实体VS 此商品的详细信息实体。
每一个商品都唯一对应一个详细信息的描述,商品实体可以没有详细信息实体。
此处我们只给出代码片段
Products(商品实体)
/**
* Products
*/
@Entity
@Table(name = "products", catalog = "tgweb")
public class Products implements java.io.Serializable {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
/**
* 详细信息
* */
@OneToOne(optional = true, cascade = CascadeType.ALL)
@JoinColumn(name = "productsMessageInfo_ID")
private ProductsMessageInfo productsMessageInfo;
/** default constructor */
public Products() {
}
…………………省略…………………
public ProductsMessageInfo getProductsMessageInfo() {
return productsMessageInfo;
}
public void setProductsMessageInfo(ProductsMessageInfo productsMessageInfo) {
this.productsMessageInfo = productsMessageInfo;
}
}
|
说明:
@OneToOne(optional = true, cascade = CascadeType.ALL)
表示和商品详细信息是一对一的关系,级联操作是当商品所有的持久化操作都会关联到详细信息的操作,详细信息可以为空。
@JoinColumn(name = "productsMessageInfo_ID")
在商品表中建立一个外键用于维护和商品详细信息的关系。字段名称为productsMessageInfo_ID。
注意:因为在商品中所有的操作都会影响到商品详细信息,所以更新商品的时候应该先将详细信息查询出来后再保存,和1 VS N一样的道理。
总结:
1. 感觉在做实体操作(尤其是更新的时候),往往都需要将原始体的关联实体临时保存到一个地方,之后还得原封不同的赋值给新实体,之后再保存。这就是级联操作的影响。要不将所有的实体属性全部加载到展示层上,View的压力比较大。
2. 在做建模设计的时候,尤其以多对多映射最为复杂、查询效率也是最低的,偶尔为了解决一个比较复杂的业务,可能要借助中间模型来做N VS M的桥梁。
3. 有效地利用Java集合映射属性,List、Set、Map等不同特点来建模。在未确定使用Set或者List的时候可以使用他们的父类Collection,Set里面的元素不能重复,这个可以通过Set的equal和hashcode方法区分是否是同一条实体记录。List是有顺序的、并且里面元素可以重复。
4. 一般都是1 VS N、N VS 1和N VS M的需求比较多,而1 VS 1相对于前几者相对来说业务需求比较少。
5. 建模、设计领域模型、类关系思考需要的时间肯定远远大于编程的时间。
6. 级联策略完全由系统的业务需求而定,没绝对的正确,也没有绝对的错误,级联策略的选择是在一个折中的情况下而制定的,有可能业务层需要多些几行代码,有可能在视图层多写一些代码来维护原有的关联关系,这个完全取决于业务。
7. 在笔者的这份经验总结中只是关联映射的一部分实现而已,像双向一对一、单向一对多、单向多对一并没有总结在这份文档中,因为暂时并无此业务需求,每每发现做单向关联设计的时候,还是双向的比较好,双方都能找到对方。以后有机会一定补上。
如果有什么不正确的希望不吝指正。
分享到:
相关推荐
本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...
### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...
### JPA学习文档知识点概述 #### 1. JPA简介 - **定义**: JPA (Java Persistence API) 是由Sun官方提出的一种Java持久化规范,旨在简化Java应用程序中关系型数据库的操作过程。其核心目标是统一现有的ORM (Object-...
### JPA 学习笔记详解 #### 一、JPA 概述 Java Persistence API (JPA) 是 Sun 公司提出的一种 Java 持久层标准,它为 Java 开发者提供了一种对象关系映射 (ORM) 的工具来管理 Java 应用程序中的关系型数据。JPA ...
总结来说,本文档涵盖了Spring JPA的基础配置和使用方法,包括所需的依赖库、持久化配置文件`persistence.xml`的编写、实体类的定义以及实体间关系的映射。通过这些知识点的学习,可以更好地理解和掌握Spring JPA的...
在深入探讨《ejb学习笔记》这一主题之前,我们首先需要理解什么是EJB(Enterprise JavaBeans)。EJB是Java平台为企业级应用开发提供的一套组件模型,它属于J2EE(Java 2 Platform, Enterprise Edition)的一部分,...
### EJB学习笔记4:深入理解实体与JPA #### 实体的概念与作用 实体,在企业级Java开发中,特别是EJB(Enterprise JavaBeans)框架下,指的是具有持久化能力的POJO(Plain Old Java Object)类。不同于实体Bean...
**EJB3.0 学习笔记** EJB(Enterprise JavaBeans)是Java EE平台中的核心组件,用于构建可扩展的、安全的、事务处理的分布式应用程序。EJB3.0是EJB的一个重大更新,引入了许多改进,使得开发过程更为简化,降低了...
EJB 3.0 版本引入了许多改进,简化了API,降低了学习曲线,使其更易于使用。 在MVC(模型-视图-控制器)架构中,EJB 主要用于开发业务层。它负责处理数据和业务逻辑,而视图层则展示数据,控制器则协调视图和模型...
7. **JPA(Java Persistence API)**:JPA是Java标准的持久化框架,简化了对象关系映射,使得Java对象可以直接与数据库进行交互。 8. **JSF(JavaServer Faces)**:JSF是一种MVC(Model-View-Controller)框架,...
在Java EE 5及更高版本中,JPA(Java Persistence API)取代了传统的实体bean,提供了更灵活的ORM(对象关系映射)。 - **消息驱动bean(Message-Driven Beans)**:用于处理JMS(Java Message Service)消息,提供...
6. **资源注入**:通过依赖注入(Dependency Injection,DI)机制,EJB可以从容器中自动获取所需的资源,如数据源、JMS队列等。 7. **接口规范**:EJB组件通过定义特定的接口来暴露其服务,这些接口定义了客户端...
本学习笔记涵盖了JavaEE的核心技术,帮助学习者深入理解和掌握javaweb的各项技能。 1. **Servlet与JSP** - **Servlet**:Servlet是Java编写的服务器端程序,主要用于扩展服务器的功能。在JavaEE中,Servlet处理...
在"达内培训的ejb课程笔记"中,学习者可能涵盖了以下内容: 1. EJB的基础概念和架构。 2. 如何创建和部署EJB组件,包括编写bean的类、接口、XML配置文件等。 3. EJB的生命周期管理,包括实例化、初始化、激活、钝化...
### JavaEE5学习笔记01-JTA和数据库事务:深入解析与应用 #### 一、JavaEE5概览与核心组件 JavaEE5是Java Enterprise Edition的第五个版本,标志着企业级Java应用的一个重要里程碑。它引入了一系列重要的新特性,...
2. **实体Bean的简化**:EJB3.0引入了JPA(Java Persistence API),这使得实体Bean的处理更加简单,开发者可以通过注解直接将Java类映射到数据库表,而无需编写繁琐的DAO层代码。 3. **无容器依赖的POJOs**:EJB...