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 ...
随机推荐
- JavaWeb(八)JQuery
jQuery 市场用得比较多两个框架: jQuery 比较适合做一些互联网 的应用(12306.com,蘑菇街,美丽说,聚美) extjs 比较适合做后台管理系统(电商(订单管理),银行,电信) 核心 ...
- sql unique约束详解
UNIQUE 约束唯一标识数据库表中的每条记录. UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证. PRIMARY KEY 拥有自动定义的 UNIQUE 约束. 请注意 ...
- [2017-08-16]ABP系列——QuickStartB:正确理解Abp解决方案的代码组织方式、分层和命名空间
本系列目录:Abp介绍和经验分享-目录 介绍ABP的文章,大多会提到ABP框架吸收了很多最佳实践,比如: 1.N层 (复用一下上篇的图) 展现层(Personball.Demo.Web):asp.ne ...
- [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum
场景描述 在web开发过程中,有时候需要根据Enum类型生成下拉菜单: 有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串. 喜欢直接用中文的请无视本文 不多说,直接看代码. 以下代码借鉴 ...
- 利用Google浏览器调试js代码
1.js有两种引入方式,外链和内嵌: 内嵌在浏览中直接调试,外链要在断点处写debugger; 示例代码: <!DOCTYPE html> <html lang="en&q ...
- 消息摘要技术(MD5)
1.使用消息摘要技术对密码加密 数据库存储的是经过消息摘要技术加密之后的信息, 避免保存密码明文,提升了系统安全性 必要性说明: 如果存储明文密码,数据库系统管理员和攻破系统的黑客是可以拿到你的所有信 ...
- spring mvc:事务引起的try/catch失效
在测试一个接口时,发现一个奇怪的现象:该接口使用@ResponseBody注解返回json格式数据,并且使用try/catch包括全部逻辑代码,debug后发现返回数据没有任何错误,只包含一段因产生异 ...
- 重写equals就必须重写hashCode的原理分析
因为最近在整理Java集合的源码, 所以今天再来谈谈这个古老的话题,因为后面讲HashMap会用到这个知识点, 所以重新梳理下. 如果不被重写(原生Object)的hashCode和equals是什么 ...
- 编辑sass报错:error style.scss (Line 3: Invalid GBK character "\xE5")解决办法
cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update header.scss:header.css error heade ...
- 使用SVG基本操作API
前面的话 本文将详细介绍SVG基本操作API,并使用这些API操作实例效果 基础API 在javascript中,可以使用一些基本的API来对SVG进行操作 [NS地址] 因为SVG定义在其自身的命令 ...