问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring+hibernate事务管理(注解方式),一对多存入数据库的问题

发布网友 发布时间:2022-04-07 22:59

我来回答

5个回答

懂视网 时间:2022-04-08 03:20

20) NOT NULL AUTO_INCREMENT, `realName` varchar(36) DEFAULT NULL, `fileContent` mediumblob, `handId` bigint(20) DEFAULT NULL, `customerId` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_id` (`handId`), CONSTRAINT `fk_id` FOREIGN KEY (`handId`) REFERENCES `handprocess` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `handprocess` ( `id` bigint(20) NOT NULL DEFAULT ‘0‘, `handTime` bigint(20) DEFAULT NULL, `handName` varchar(20) DEFAULT NULL, `reason` varchar(100) DEFAULT NULL, `annexStr` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

处理过程(handprocess)和附件表(annex)一对多关系,一条处理过程可以有多个附件

除了springmvc+hibernate+spring的jar,还需要

commons-fileupload-1.3.1.jar

commons-io-2.0.1.jar

数据库保存上传文件内容使用mediumblob类型

mysql保存数据库二进制文件使用blob类型,其大小如下

TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

springmvc中需添加配置文件

<bean id="multipartResolver"
 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="10000000"></property> <!-- byte -->
 <property name="defaultEncoding" value="utf-8" />
 </bean>

其中maxUploadSizes的大小是上传文件大小,单位:字节

实体:

package com.h3c.zgc.upload;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * 附件 和处理过程多对一
 * @author GoodLuck
 *
 */
@Entity
@Table(name="annex",catalog="itac")
public class Annex {
 @Id
 @Column(name="id")
 private Long id;
 //上传文件的名称
 @Column(name="realName")
 private String realName;
 //上传文件的内容
 @Column(name="fileContent")
 private byte[] fileContent;
 //处理过程的id
 @Column(name="handId")
 private Long handId;
 //客户id
 @Column(name="customerId")
 private Long customerId;
 
 //getter and setter ...
 
 
}
package com.h3c.zgc.upload;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="handprocess",catalog="itac")
public class HandProcess {
 
 @Id
 @Column(name="id")
 private Long id;
 @Column(name="handTime")
 private Long handTime;
 @Column(name="handName")
 private String handName;
 @Column(name="reason")
 private String reason;
 @Column(name="annexStr")
 private String annexStr;
 @Transient
 private String handTimeStr;
 
 //getter and setter ...
 
 
}

dao层

package com.h3c.zgc.upload;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class UploadDownDao extends HibernateDaoSupport{
 @Resource
 public void set(SessionFactory sessionFactory){
 this.setSessionFactory(sessionFactory);
 }
 
 public Session getSession(){
 return this.getSessionFactory().openSession();
 }
 /**
 * 获取附件id最大值
 */
 public Long getMaxIdOfAnnex(){
 List l = this.getHibernateTemplate().find("select max(id) from Annex");
 System.out.println(l);
 if(l!=null&&l.size()==1&&l.get(0)!=null){
  return (Long) l.get(0);
 }
 return 0L;
 }
 /**
 * 获取处理过程id最大值
 * @return
 */
 public Long getMaxIdOfHandProcess(){
 List l = this.getHibernateTemplate().find("select max(id) from HandProcess");
 System.out.println(l);
 if(l!=null&&l.size()==1&&l.get(0)!=null){
  return (Long) l.get(0);
 }
 return 0L;
 }
 /**
 * 保存附件
 * @param annex
 * @return
 */
 public Serializable saveAnnex(Annex annex){
 return this.getHibernateTemplate().save(annex);
 }
 /**
 * 保存处理过程
 * @param hp
 * @return
 */
 public Serializable saveHandProcess(HandProcess hp){
 return this.getHibernateTemplate().save(hp);
 }
 /**
 * 获取处理过程列表,左连接查询
 * @return
 */
 public List getHandProcessList(){//有没有可能没有附件,附件annex,处理过程handprocess
 SQLQuery query = this.getSession().createSQLQuery("select h.id handprocessId,h.annexStr annexStr,a.id annexId,a.realName realName,h.handTime handTime,h.handName handName,h.reason reason from handprocess h left join annex a on a.handId=h.id");
 query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
 List list = query.list();
 return list;
 }
 /**
 * 根据id获取附件信息
 * @param annexId
 * @return
 */
 public Annex getAnnexById(Long annexId){
 return this.getHibernateTemplate().get(Annex.class, annexId);
 }
 /**
 * 修改处理过程
 * @param hp
 */
 public void updateHandProcess(HandProcess hp){
 this.getHibernateTemplate().update(hp);
 }
}

service层

package com.h3c.zgc.upload;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.transaction.Transactional;

import org.springframework.stereotype.Service;

@Service
public class UploadDownService {

 @Resource
 private UploadDownDao uploadDownDao;
 
 public Long getMaxIdOfAnnex(){
 return this.uploadDownDao.getMaxIdOfAnnex();
 }
 public Long getMaxIdOfHandProcess(){
 return this.uploadDownDao.getMaxIdOfHandProcess();
 }
 @Transactional
 public Serializable saveAnnex(Annex annex){
 return this.uploadDownDao.saveAnnex(annex);
 }
 @Transactional
 public Serializable saveHandProcess(HandProcess hp){
 return this.uploadDownDao.saveHandProcess(hp);
 }
 public Annex getAnnexById(Long annexId){
 return this.uploadDownDao.getAnnexById(annexId);
 }
 public List<Map<String,Object>> getHandProcessList(){
 return this.uploadDownDao.getHandProcessList();
 }
 @Transactional
 public void updateHandProcess(HandProcess hp){
 this.uploadDownDao.updateHandProcess(hp);
 }
}

controller层

package com.h3c.zgc.upload;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class UploadDownFileController {
 @Resource
 private UploadDownService uploadDownService;
 //单文件上传到数据库,MultipartFile中封装了上传文件的信息
 @RequestMapping("upload")
 public String upload(HandProcess hp, HttpServletRequest request,
  @RequestParam("uploadFile1") MultipartFile uploadFile1)
  throws IOException, ParseException {
 
 InputStream is = uploadFile1.getInputStream();
 byte[] buffer = this.inputStrean2ByteArr(is);
 /**
  * 保存处理过程信息
  */
 // get max id then ++1
 Long hpMaxId = this.uploadDownService.getMaxIdOfHandProcess();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 hp.setHandTime(df.parse(hp.getHandTimeStr()).getTime());
 hp.setId(hpMaxId + 1);
 //保存处理过程
 Serializable hpId = this.uploadDownService.saveHandProcess(hp);
 /**
  * 保存附件
  */
 Annex annex = new Annex();
 annex.setCustomerId(1L);
 annex.setHandId((Long) hpId);
 annex.setRealName(uploadFile1.getOriginalFilename());
 annex.setFileContent(buffer);
 //查找附件id最大值
 annex.setId(this.uploadDownService.getMaxIdOfAnnex() + 1);
 Serializable aid = this.uploadDownService.saveAnnex(annex);
 /**
  * 获取处理过程列表
  */
 List<Map<String, Object>> as = this.uploadDownService
  .getHandProcessList();
 for (Map<String, Object> map : as) {
  map.put("handTime", df.format(map.get("handTime")));
 }
 request.setAttribute("as", as);
 return "annex/annexList";
 }
 /**
 * 多文件上传
 * @param hp 处理过程
 * @param request
 * @param uploadFile1 上传文件
 * @return
 * @throws IOException
 * @throws ParseException
 */
 @RequestMapping("uploadOneMore")
 public String uploadOneMore(HandProcess hp, HttpServletRequest request,
  @RequestParam("uploadFile1") MultipartFile[] uploadFile1)
  throws IOException, ParseException {
 /**
  * 保存处理过程信息
  */
 // get max id then ++1
 Long hpMaxId = this.uploadDownService.getMaxIdOfHandProcess();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 hp.setHandTime(df.parse(hp.getHandTimeStr()).getTime());
 hp.setId(hpMaxId + 1);
 //
 Serializable hpId = this.uploadDownService.saveHandProcess(hp);
 //保存改工单下的所有附件
 for (int i = 0; i < uploadFile1.length; i++) {
  InputStream is = uploadFile1[i].getInputStream();
  byte[] buffer = this.inputStrean2ByteArr(is);

  /**
  * 保存附件
  */
  Annex annex = new Annex();
  annex.setCustomerId(1L);
  annex.setHandId((Long) hpId);
  annex.setRealName(uploadFile1[i].getOriginalFilename());
  annex.setFileContent(buffer);
  annex.setId(this.uploadDownService.getMaxIdOfAnnex() + 1);
  Serializable annexId = this.uploadDownService.saveAnnex(annex);
  
 }
 //多文件上传,一个处理过程下面要有多个附件,在页面中显示的时候,一个处理过程后面要显示多个附件
 //更新表handprocess
 this.uploadDownService.updateHandProcess(hp);
 
 List<Map<String, Object>> as = this.uploadDownService
  .getHandProcessList();
 request.setAttribute("as", as);
 return "annex/annexList";
 }
 
 /**
 * 文件下载
 * @param response
 * @param annexId
 * @throws IOException
 */
 @RequestMapping("download")
 public void download(HttpServletResponse response, Long annexId)
  throws IOException {
 Annex a = this.uploadDownService.getAnnexById(annexId);
 byte[] b = a.getFileContent();
 response.setContentType("application/octet-stream;charset=UTF-8");
 response.setCharacterEncoding("utf-8");
 response.setHeader("Content-Disposition",
  "attachment;filename=" + new String(a.getRealName().getBytes("gbk"),"iso-8859-1")); //防止文件乱码

 BufferedOutputStream bos = new BufferedOutputStream(
  response.getOutputStream());
 bos.write(b);
 bos.close();
 }
 /**
 * inputstream转成byte数组
 * @param inStream
 * @return
 * @throws IOException
 */
 public byte[] inputStrean2ByteArr(InputStream inStream) throws IOException {
 ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
 byte[] buff = new byte[100];
 int rc = 0;
 while ((rc = inStream.read(buff, 0, 100)) > 0) {
  swapStream.write(buff, 0, rc);
 }
 byte[] in2b = swapStream.toByteArray();
 return in2b;
 }

}

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/js/jquery-1.11.1.js"></script>
</head>
<body>
<a href="${pageContext.request.contextPath }/getAllStudent">查找所有用户</a>
<a href="${pageContext.request.contextPath }/savePerson">单独保存Person</a>
<a href="${pageContext.request.contextPath }/savePersonHouse">保存Person和House</a>
<br/>
<form action="${pageContext.request.contextPath }/getArr" >
 <input type="text" name="workSheetId"/><br/>
 <input type="submit" value="search"/>
</form>
<br/><br/><br/> 
<form action="<c:url value="/upload"/>" method="post" enctype="multipart/form-data">
 处理时间:<input type="text" name="handTimeStr"/><br>
 处理人:<input type="text" name="handName"/><br/>
 原因:<input type="text" name="reason"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 <input type="submit" value="submit"/>
</form>
<br/>
upload one more
<form action="<c:url value="/uploadOneMore"/>" method="post" enctype="multipart/form-data">
 处理时间:<input type="text" name="handTimeStr"/><br>
 处理人:<input type="text" name="handName"/><br/>
 原因:<input type="text" name="reason"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 <input type="submit" value="submit"/>
</form>
</body>
</html>

annexList.jsp  显示处理过程已经处理过程下附件

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript"
 src="${pageContext.request.contextPath }/resources/js/jquery-1.11.1.js"></script>
</head>
<body>
 <table>
 <c:forEach items="${as }" var="ah" varStatus="status">
  <tr>
  <td>${ah[‘handprocessId‘] }</td>
  <td>${ah[‘handName‘] }</td>
  <td>${ah[‘reason‘] }</td>
  <td id="id${status.index }">${ah[‘handTime‘] }</td>
  
  <td>
   ${ah[‘annex‘][‘realName‘] }
   <a href="<c:url value="/download?annexId=${ah[‘annexId‘] }"/>">${ah[‘realName‘] }</a>
  </td>
  </tr>
 </c:forEach>


 </table>
</body>
<script type="text/javascript">
 
</script>
</html>

 

springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传

标签:

热心网友 时间:2022-04-08 00:28

....上面的都是高手。。。。 楼主 inverse="true" 的意思是关系反转 维护关系的一方交给多的一方了 现在你在一的一方插入数据 是因为你写了级联所以才在SaleDetail. 插入了数据 但是因为Sale是不维护关系的 所以SaleDetail 的saleId为空 程序没有别的问题的话 有两种解决方式 第一种是去掉关系反转 第二种是在多的一段进行插入数据

热心网友 时间:2022-04-08 01:46

嘿嘿~~
么~~一般么用中间件都会有提示(即ALT+/),根据提示显示的单词配置,不懂就查资料,上网下视频看,例如 cascade="all" 级联效果,设个save-update就行了,当然也要看有什么需求哦,有时间和耐心就多试试myeclipse的提示么~~
数据库中在外间处可以设的哦~~注意看表的编辑中的key的去找cascade、none等......
好无聊啊~~刚学完四种关系~~一起用好麻烦~~不能称心如意呀~~吐糟一下~~BYE~~

热心网友 时间:2022-04-08 03:21

可能是hibernate映射文件映射错误追问Sale.hbm.xml里一对多的配置

SaleDetail.hbm.xml里关联外键SaleID的配置

少了什么东西吗..

热心网友 时间:2022-04-08 05:12

我当时写的时候 比如有个UserNameID,我选择的是数据库自动生成,我用myeclipse生成的时候,系统还默认给我配了个UserId(数据库里面没有)也给了我得到这个UserId的方法。我建议你不要手动插入id,试试看,我也不知道对不对。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 嘴唇上有黑印用蜜蜡和棉线去除了胡须 生完可以不喂奶吗 我的显卡要求500w电源,可是我买的时候没注意买了个450w的,会有影响吗? 不母乳喂养对女性的好处 500W和550W电源有区别吗? 电源400w和500w的差距 振华冰山金蝶500W模组和振华冰山金蝶450W有什么区别 400W和450W和500W的区别大么? 额定功率400W最大功率500W与额定功率450W 最大功率500W有什么区别? 商场买的充电宝有电吗 网购拿到的充电宝还有电吗? 这是我在网上买的充电宝,去快递那里给拿回来看到充电宝有100%的电量,究竟是用完电在充还是已经满电 女主和斯内普是同学,暗恋斯内普。教授死时,用一种魔法使得时光倒流,重生到了一年级,并且上辈子是赫奇 买回来的iphone充电宝里面有电吗? 哈利波特第七部谁死了? 淘宝买的充电宝,送过来还有多少电 哈利波特7的所有资料 《哈利波特7》的结局是怎样的?哈利死了没? 刚买的充电宝有电没 谁知道有关哈利波特7 在网上买的新充电宝里面有没有电啊?一次都没冲 如何科学坐月子,不哺乳 不喂奶要怎么处理 如果电源的额定功率是400W 最大功率是500W 而我的电脑需要450W的电源 请问这个电源可以正常供电吗? 为什么有一些人不喂奶 500W和550W电源有区别吗 价格一样的话 选哪个 500W和550W耗电量一样吗 哺乳和不哺乳对妈妈有什么区别 多久不喂奶会回奶 不能母乳喂养的情况有哪些 不喂奶怎样退奶 不母乳胸就不会缩小吗 为什么不喂奶就没有奶水 不喂奶的哺乳期是多久 不喂奶会下垂吗 不喂奶胸会下垂吗 笔记本内存占用特别高 内存爆满? 笔记本电脑开机内存爆满,超卡,无法正常运行,急需帮助,该怎么办。情况见补充 笔记本内存占用过高怎么处理,现在电脑很卡。。 笔记本无缘无故就占了很大内存怎么办 万圣节的由来?老外过万圣节有什么风俗? 2022在职研究生报名时及考试时间!在职研究生报考条件及流程是什么?