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 多对多关系的实现注解形式的更多相关文章

  1. JPA多对多关联

    关于JPA多对多关系,这是使用学生与教师来表示.一个Student由多个Teacher教,同样一个Teacher也可以教多个学生.Student类如下: package com.yichun.bean ...

  2. JPA一对多和多对一关系

    1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...

  3. [Z]Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  4. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

  5. Spring Data JPA 之 一对一,一对多,多对多 关系映射

    一.@OneToOne关系映射 JPA使用@OneToOne来标注一对一的关系. 实体 People :用户. 实体 Address:家庭住址. People 和 Address 是一对一的关系. 这 ...

  6. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  7. 2.2、Hibernate用注解方式实现一对多、多对多关系

    一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...

  8. Hibernate用注解方式实现一对多、多对多关系

    一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...

  9. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

随机推荐

  1. web前端笔记整理一---HTML

    一 HTML标签1 页面及标记 1 HTML 文件结构 拓展名 .html或者.htm <!DOCTYPE html>// 声明 <html> html 主体 <head ...

  2. 利用CoreAnimation实现一个时间的进度条

    (个人原创,转载请注明出处 http://www.cnblogs.com/pretty-guy/p/7460334.html) 在iOS中实现进度条通常都是通过不停的设置progress来完成的,这样 ...

  3. JavaScrpt笔记之第三天

    1.JavaScriot代码规范 代码规范通常包括以下几个方面: 变量和函数的命名规则 空格,缩进,注释的使用规则. 其他常用规范-- 规范的代码可以更易于阅读与维护. 2.命名规则 一般很多代码语言 ...

  4. Java基础---IO(三)--IO包中的其他类

    第一讲     对象序列化 一.概述 将堆内存中的对象存入硬盘,保留对象中的数据,称之为对象的持久化(或序列化).使用到的两个类:ObjectInputStream和ObjectOutputStrea ...

  5. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  6. docker 添加国内源

    docker for mac 获取地址:dao镜像地址  # 163的地址 https://hub-mirror.c.163.com docker for mac的设置操作:   点击Apply ...

  7. 关于Jaccard相似度在竞品分析中的一点思考

    上个月对一个小项目的效果进行改进,时间紧,只有不到一周的时间,所以思考了一下就用了最简单的方法来做,跟大家分享一下(项目场景用的类似的场景) 项目场景:分析一个产品的竞品,譬如app的竞品.网站的竞品 ...

  8. 第2阶段——编写uboot之启动内核和制作Makefile(2)

    目标: 1   添加头文件setup.h和serial.h 2   写main函数   2.1 帮内核设置串口0, (内核启动会打印出启动信息) 2.2把内核读入到SDRAM 2.3设置参数(参考u- ...

  9. 记一次wiki数据爬取过程

    最近有个爬取各国领导人信息的奇怪需求,要求百度和维基两种版本的数据,最要命的还要保持数据的结构不变.正好印象中隐约记得维基有专门的领导人列表页,不考虑爬取下来的格式不变的话应该很好爬的样子. 首先思路 ...

  10. C语言中指针*p[N], (*P)[N],及**p的区别

    在C语言编程中指针经常困扰着我们,但是若能灵活运用指针的话,将会使得我们编程变得更加轻松与高效.这里讲下*p[N], (*P)[N],及**p的区别,这也是之前经常困扰我的地方. 这三者的定义分别为: ...