jpa 多对多关系的实现注解形式
1, 表结构
1)设备表 VTM_DEVICE_INFO
create table VTM_DEVICE_INFO ( ID INTEGER not null, SN ) not null, STATUS INTEGER, MEMO ), DEVICE_NO INTEGER, START_TIME ), END_TIME ), FACTORY INTEGER, DEVICE_IN_DATE ), ISAFEDOOR_POSITION INTEGER, AUDIT_FLAG ) ); alter table VTM_DEVICE_INFO add constraint PK_VTM_DEVICE_INFO primary key (ID);
2)模块表 VTM_MODULE_DEFINE
create table VTM_MODULE_DEFINE ( ID INTEGER not null, MODULE_NAME ) not null ); alter table VTM_MODULE_DEFINE add constraint PK_VTM_MODULE_DEFINE primary key (ID);
3)设备模块关系表 VTM_DEVICE_MODULE
create table VTM_DEVICE_MODULE ( DEVICE_ID INTEGER not null, MODULE_ID INTEGER not null ) ; alter table VTM_DEVICE_MODULE add constraint FK_VTM_DEVI_REF_DEVIC_VTM_DEVI foreign key (DEVICE_ID) references VTM_DEVICE_INFO (ID); alter table VTM_DEVICE_MODULE add constraint FK_VTM_DEVI_REF_DEVIC_VTM_MODU foreign key (MODULE_ID) references VTM_MODULE_DEFINE (ID);
4)初始化模块表数据
, '读卡器'); , '密码键盘'); , '取款模块'); , '存款模块');
5)数据库中要到的序列
create sequence DEVICE_INFO_SEQ minvalue maxvalue start increment cache ; create sequence DEVICE_MODULE_SEQ minvalue maxvalue start increment cache ;
设备表 与 模块表 之间是多对多的关系,关系表为 设备模块表
2,实体类采用注解的形式,体现他们之间的关系
package opstools.vtm.device.entity; import java.io.Serializable; import java.util.Date; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType;/** * 设备实体类 * @author yangw */ @Entity @Table(name = "VTM_DEVICE_INFO") @SequenceGenerator(name = "deviceInfoSeq", sequenceName = "DEVICE_INFO_SEQ") public class DeviceInfo implements Serializable { private static final long serialVersionUID = -6964820074623402896L; @Id @Column(name="ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "deviceInfoSeq") private Integer deviceId; //设备Id @Column private String sn; //序号 @Column private Integer status; //设备使用状态 @Column private Integer branchId; @Column private String memo; //备注信息 @Column private Integer deviceNo; //设备型号 @Temporal(TemporalType.TIMESTAMP) @Column private Date startTime; //开始使用时间 @Temporal(TemporalType.TIMESTAMP) @Column private Date endTime; //设备终止时间 @Column private Integer factory; //设备厂商 @Temporal(TemporalType.TIMESTAMP) @Column private Date deviceInDate; //设备增加时间 @Column private Integer isafedoorPosition; //开门方向 @Column private Integer auditFlag; //审核标志 @ManyToMany(cascade=CascadeType.PERSIST) @JoinTable(name = "VTM_DEVICE_MODULE", joinColumns = {@JoinColumn(name = "deviceId")},inverseJoinColumns=@JoinColumn(name="MODULE_ID")) private Set<ModuleDefine> moduleDefine; //get set 省略 }
package opstools.vtm.device.entity; import java.io.Serializable; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; /** * 设备模块表 * @author yangw */ @Entity @Table(name = "VTM_MODULE_DEFINE") @SequenceGenerator(name = "moduleDefineSeq", sequenceName = "MODULE_DEFINE_SEQ") public class ModuleDefine implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name="ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "moduleDefineSeq") private Integer moduleId; //模块Id @Column private String moduleName; //模块名称 @ManyToMany(mappedBy = "moduleDefine") private Set<DeviceInfo> deviceInfo; //省略 get set 这个类可能不需要再写@ManyToMany来维护关系,因为这个表的数据是初始化好的,不需要修改, 具体没有测试. }
3, dao层的实现,就是将 设备添加到数据库
@Override public void createDeviceInfo(DeviceInfo deviceInfo) { super.create(deviceInfo); }
4,service层的实现,将模块信息设置到设备类的属性中.
@Override public void createDeviceInfo(DeviceInfo deviceInfo, Integer[] moduleIds) { if(moduleIds!=null){ Set<ModuleDefine> defineSet=deviceInfo.getModuleDefine(); if(defineSet==null){ defineSet=new HashSet<ModuleDefine>(); } for(int i=0;i<moduleIds.length;i++){ ModuleDefine define=new ModuleDefine(); define.setModuleId(moduleIds[i]); defineSet.add(define); } deviceInfo.setModuleDefine(defineSet); } deviceInfoDao.createDeviceInfo(deviceInfo); }
5,action层的简单实现
@Override public void submitPage(String pageName) throws Exception { deviceInfo.setStartTime(DateSupportUtils.str2second(startTime)); deviceInfo.setEndTime(DateSupportUtils.str2second(endTime)); if(pageName.equals(PAGE_CREATE)){ deviceInfo.setDeviceInDate(new Date()); deviceInfoService.createDeviceInfo(deviceInfo,moduleIds); } else if(pageName.equals(PAGE_UPDATE)){ deviceInfoService.updateDeviceInfo(deviceInfo); } }
6,界面jsp页面,简单给大家看看.
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>${pageTitle}</title> <s:include value="../../../include/page.jsp"/> <style type="shett"></style> <script type="text/javascript" > //这里的代码是级联获取下拉框数据,省略掉,可以参考上一篇处理json的代码</script> </head> <body onload="Page.init('${pageError}','${pageMessage}',${isSubmit})"> <div id="title">${pageTitle}</div> <s:form id="MYFORM" action="%{pageAction}" method="post" theme="simple"> <input type="hidden" value="0" name="deviceInfo.status"/> <input type="hidden" value="0" name="deviceInfo.auditFlag"/> <div id="content"> <table> //下面一种标签只列出来了一个 <tr> <th width="13%">开始使用时间:</th> <td width="35%"><div> <input name="startTime" value="<s:date name="deviceInfo.startTime" format="yyyy-MM-dd HH:mm:ss"/>" class="Wdate" onfocus="WdatePicker({isShowClear:false,dateFmt:'yyyy-MM-dd HH:mm:ss',readOnly:true})"/> </div></td> </tr> <tr> <th width="17%">设备厂商:</th> <td width="35%"><s:select name="deviceInfo.factory" id="deviceFactory" list="deviceFactoryList" listKey="realValue" listValue="displayValue" headerKey="" headerValue="请选择"/> </td> </tr> <tr> <th width="17%">模块:</th> <td width="35%" > <div> <s:checkboxlist name="moduleIds" cssClass="checkbox" list="moduleList" listKey="realValue" listValue="displayValue" > </s:checkboxlist> </div> </td> </tr> <tr> <th width="13%">备注信息:</th> <td width="35%" colspan="3" ><div> <s:textarea name="deviceInfo.memo" onblur="Check.checkLength(this,256)"/> </div></td> </tr> </table> </div> <div id="operator"> <div class="left"></div> <div class="middle" onclick="Page.submit()">提交</div> <div class="right"></div> <div class="left"></div> <div class="middle" onclick="Page.close()">关闭</div> <div class="right"></div> </div> </s:form> </body> </html>
jpa 多对多关系的实现注解形式的更多相关文章
- JPA多对多关联
关于JPA多对多关系,这是使用学生与教师来表示.一个Student由多个Teacher教,同样一个Teacher也可以教多个学生.Student类如下: package com.yichun.bean ...
- JPA一对多和多对一关系
1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...
- [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明
JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...
- Spring Data JPA 之 一对一,一对多,多对多 关系映射
一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- 2.2、Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
随机推荐
- Redis笔记——技术点汇总
目录 · 特点 · 安装 · 数据库 · 服务器命令 · 数据类型及其操作命令 · 数据结构 · string · list · set · hash · zset · 发布与订阅 · 排序 · 事务 ...
- JS针对pc页面固定宽度在手机展示问题 <meta ...>
结合一些 网上大神级前端作品的 介绍 修改了一下自己的代码 做出了一个相对简单的缩放代码 1. <meta name="viewport" content="wi ...
- SpringMVC获取页面数据乱码的解决get/post
一.post请求方式的乱码 在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name ...
- Servlet使用简介
Servlet的使用基本包含三个步骤: 1.继承HttpServlet 或实现Servlet 接口 (根据源码分析最终都是对servlet接口的实现) 2.配置地址: 配置web.xml 或者用注解的 ...
- Java基础语法(三)---数组
一.概念 同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ...
- koa/redux middleware系统解析
middleware 对于现有的一些框架比如koa,express,redux,都需要对数据流进行一些处理,比如koa,express的请求数据处理,包括json.stringify,logger,或 ...
- autoconf添加gcc调试选项
autoconf生成的编译选项默认是"-g -O2".这个"-g"选项将我迷惑了,以为生成了GDB调试所需的信息,所以也就没有管后面的"-O2“选 ...
- carry-检查数据接口返回数据合法性
问题背景: 在测试&部署监控过程中,我们常常会遇到外部接口返回数据不靠谱的时候.最常见的场合是从某个http获取如json和xml等结构化的结果,进行解析并处理,在这时候出现以下这几种常见类型 ...
- 【Ztree】前台展示多级菜单,后台配置方法
第一步.前台HTML页面. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- selenium 对https网站(加密证书)进行自动化测试
由于公司需要,被测网站有证书加密,由于在selenium启动firefox的时候,它会重新建一个profile作为启动的profile,所以无论你怎么把站点设为可信任站点,在selenium启动的fi ...