EasyUi Hibernate 增加编辑book对象,里面又有book类型对象;添加编辑时在combobox动态加载book的类型

最近弄book的增改花了不少时间,主要是在bookType上花的时间较多。

Book

@Entity
@Table(name="T_Book")
@DynamicInsert(true)
@DynamicUpdate(true)
public class Book implements java.io.Serializable  {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="BookId")
	private int BookId;
	//虚拟属性,每次查询时,还要查询有多少本书,可借多少本,然后赋值,这样book就能添加这两个参数了
	@Transient
	private int totalNum;//馆藏数
	@Transient
	private int canBorrowNum;//可借数
	/**
	 * 用于业务逻辑的字段,注解@Transient代表不需要持久化到数据库中
	 */

	@ManyToOne
    <span style="white-space:pre">	</span>@JoinColumn(name="BookTypeId")    //重点!!!!!!!!!!!!!
	private BookType BookType;

	//抓取策略为EAGER,要不然bookService统计有多少本书时错误。
	@OneToMany(mappedBy="Book",cascade=(CascadeType.ALL), fetch=FetchType.EAGER)
	 private Set<BookSN> BookSNs;

	@Column(name="BookName")
	private String BookName;

    //省略部分属性和set,get函数
}
@Entity
@Table(name="T_BookType")
@DynamicInsert(true)
@DynamicUpdate(true)
public class BookType implements java.io.Serializable  {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="BookTypeId")
	private int BookTypeId;

	@Column(name="BookTypeName")
	private String BookTypeName;
	@Column(name="BookTypeCode")
	private String BookTypeCode;
	 @OneToMany(mappedBy="BookType")
	  private Set<Book> Books;

//省略get和set函数
}

jsp(用html创建而不是jquery):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<%@ include file="/common/base.jsp"%> <%--前面加了/就是代表绝对路径,即包含了localhost+端口号+项目名 --%>
	<script type="text/javascript">
		var url;
		function newBook(){
			$('#dlg').dialog('open').dialog('setTitle','添加书籍');
			$('#fm').form('clear');
			document.getElementById("fieldBookID").style.visibility="hidden"; //这里书籍id是自增长,所以不用显示id字段
			url = 'book/addBook';
		}
		function editBook(){
			var row = $('#dg').datagrid('getSelected');
			// alert(row.userId);
			if (row){
				$('#dlg').dialog('open').dialog('setTitle','编辑书籍');
				$('#fm').form('load',row);
				//解决编辑是不能显示书类型问题 这里要注意的是设置combox的值是bookTypeId而不是bookTypeName,因为传到后台是要bookTypeId的而//不是bookTypeName!!!!!!!!!!!!!!!
				if(row.bookType.bookTypeName!=null){
					$('#formBookType').combobox('setValue',row.bookType.bookTypeId);
					}
				url ='book/updateBook';
			}
		}
		function saveBook(){
			$.post(url, sy.serializeObject($('#fm')), function(result) {
				if (result.success) {
						$.messager.show({
						title:'Info',
						msg:result.msg,
						showType:'fade',
						style:{
							right:'',
							bottom:''
							}
						});
						$('#dlg').dialog('close');		// close the dialog
						$('#dg').datagrid('reload');	// reload the user data
				} else {
					$.messager.show({
						title: 'Error',
						msg: result.msg
					});
				}
			}, 'json');
		}
		function doSearch(){
			$('#dg').datagrid('load',{
			queryBookName: $('#searchBox').val()
		});
}
	function clearSearch(){
		$('#searchBox').val('');
		$('#dg').datagrid('load',{});
	}
	//这里因为不能再field里面直接用bookType.bookTypeName,所以要用formatter!!!!!!!
	function formatBookType(val,row,index){
		//alert(row.bookType);
		if(row.bookType==null){
			return "";
		}else
			return row.bookType.bookTypeName;
	}
	</script>
</head>
<body class="easyui-layout"  data-options="fit:true,border:false">
	<table id="dg" class="easyui-datagrid" data-options="fit:true,border:false"
			url="book/listBookForUser"
			toolbar="#toolbar" pagination="true"
			rownumbers="true" fitColumns="true" singleSelect="true">
		<thead>
			<tr>
				<th field="bookId" value= width="50">书ID</th>
				<th field="bookName" width="50">书名</th>
				<th field="bookType.bookTypeName" width="50" formatter="formatBookType">书类型</th>
				<th field="author" width="50">作者</th>
				<th field="callNumber" width="50">索书号</th>
				<th field="iSBN" width="50">ISBN</th>
				<th field="publisher" width="50">出版社</th>
				<th field="publishYear" width="50">出版年份</th>
				<th field="series" width="50">系列</th>
				<th field="language" width="50">语言</th>
				<th field="price" width="50">价格</th>
				<th field="page" width="50">页数</th>
			</tr>
		</thead>
	</table>
	<div id="toolbar">
		<br>
		<a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="newBook()">New Book</a>
		<a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-edit" plain="true" onclick="editBook()">Edit Book</a>
		<div>
			<span>BookName:</span>
			<input id="searchBox" style="line-height:26px;border:1px solid #ccc">
			<a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-search" plain="true" onclick="doSearch()">Search</a>
			<td><a href="javascript:void(0);" class="easyui-linkbutton" iconCls="ext-icon-zoom_out" plain="true" onclick="clearSearch()">清空查询</a></td>
		</div>
	</div>

	<div id="dlg" class="easyui-dialog" style="width:300px;height:350px;padding:10px 20px"
			closed="true" buttons="#dlg-buttons">
		<form id="fm" method="post" novalidate>
		<table cellpadding="5">
		<div class="fitem" id="fieldBookID">
				<label>书ID:</label>
				<input name="bookId" readonly="readonly">
			</div>
			<div class="fitem">
				<label>书名:</label>
				<input name="bookName" class="easyui-validatebox" required="true" >
			</div>
			<label>书类型:</label> <!--这里极其注意每一个字段。select name为bookTypeId ->
				<select name="bookType.bookTypeId" id="formBookType" class="easyui-combobox" data-options="required:true,editable:false,valueField:'bookTypeId',textField:'bookTypeName',url:'bookType/getBookType',panelHeight:'auto'" style="width: 155px;"></select>

			<div class="fitem">
				<label>作者:</label>
				<input name="author">
			</div>
	       //省略部分属性!!!!!!!!!!!!!!!!
		</table>
		</form>

	</div>
	<div id="dlg-buttons">
		<a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-ok" onclick="saveBook()">Save</a>
		<a href="javascript:void(0);" class="easyui-linkbutton" iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')">Cancel</a>
	</div>
</body>
</html>

jsp要注意的地方很多。。。

BookController:

@Controller
@RequestMapping("/book")
public class BookController extends BaseController {
	@Autowired
	private IBookService bookService;
	@RequestMapping("/borrow")
		/**
		 * 用于管理员查询和添加书籍
		 * @param request
		 * @param response
		 * @return  书籍基本信息列表
		 * @throws Exception
		 */
	  @RequestMapping("listBookForUser")
	   public String listBookForUser(HttpServletRequest request,
				HttpServletResponse response) throws Exception {
		page=ServletRequestUtils.getIntParameter(request, "page", 1);//默认值为1
		rows=ServletRequestUtils.getIntParameter(request, "rows", 0);
		String queryBookName=request.getParameter("queryBookName");//获取要查询的用户账号
	//	System.out.println(queryBookName);
		Grid grid = new Grid();
		String hql=null;
		long totalNum;
		List<Book>books;
		if(queryBookName!=null)
		{
			hql="from Book as book where book.BookName like  '%"+queryBookName+"%'";
		}else{
			hql="from Book";
		}
			books=(List<Book>)bookService.find(hql, page, rows);
			totalNum=bookService.count("select count(*)"+hql);
			grid.setTotal(totalNum);
			grid.setRows(books);
			writeJson(grid,response);
			return null;
	    }
	   @RequestMapping("/goAddBook")
	   public ModelAndView goAddBook(){
		  return new ModelAndView("book/addBook");
	    }
		/**
		 * 管理员添加书籍
		 * @param book
		 * @param request
		 * @param response
		 * @return
		 * @throws Exception
		 */
	   @RequestMapping("/addBook")
		 public String addBook(Book book,HttpServletRequest request,
					HttpServletResponse response) throws Exception{
			Json json = new Json();//用于向前端发送消息
			//这里怎么判断一本书是否存在? ISBN不同版次可能一样么?
			//if(bookService.getById(book.getBookId())!=null){
		//		json.setMsg("添加书籍失败,用户已存在!");
			//}else{
			System.out.println("34657");
				bookService.save(book);
				json.setMsg("添加书籍成功!");
				json.setSuccess(true);
		//	}
			writeJson(json,response);
			return null;
			}
	   @RequestMapping("/updateBook")
		 public String updateBook(Book book,HttpServletResponse response) throws Exception{
			Json json = new Json();//用于向前端发送消息
			try{
					bookService.update(book);
					json.setMsg("更新成功!");
					json.setSuccess(true);
			}catch(Exception e){
				json.setMsg("更新失败!"+e.getMessage());

			}
			writeJson(json,response);
			return null;
		}

}
时间: 2024-12-31 21:16:50

EasyUi Hibernate 增加编辑book对象,里面又有book类型对象;添加编辑时在combobox动态加载book的类型的相关文章

【EasyUi DataGrid】动态加载列

动态加载列可以说是一个从无到有的过程,如果只是网页上的DataGrid实现那就太无味了,有趣的在这里,这个页面上连带着一大堆的数据库表的查询修改,尤其是做着做着发现数据表设计有缺陷,需要的数据竟然只有出口没有入口,想想也是醉了,对业务不熟悉真心的杀不起啊.这个其实蛮好玩的,就像玩捉迷藏藏得那个人叫做nothing,再后来我又遇到了Multiple-births(多胞胎),一个页面上涉及到了六七张数据库表,里边的字段名虽然不一样,可它就是达到了百分之七八十的相似度,多亏咱是上过学的,欺负不了我读书

atitit.动态加载数据库配置in orm hibernate mybatis

atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象,,,,生成工厂类,在opoenSession 1 2.1. Hibernate动态添加配置流程 1 2.2. mybatis动态添加配置流程 1 2.3. #===hb code 2 3. 参考 3 1. 动态加载数据库配置的优点::: 1.1. 组合多个配置文件... 1.2. 连接多个数据库 2

jquery easyui datagrid 动态 加载列

实现方式: 首先根据输入的sql语句获得相关的列名称返回给前台,然后在datagrid中动态加载列,接着根据查询条件(包括sql语句)获取相关的记录返回给前台用于填充datagrid.从而实现类似oracle web版的sql查询. 前台主要js为: Js代码   function sqlSearch(){ var sqlStatement = $.trim($("#sqlStatementId").val()); if(sqlStatement == null || sqlState

如何用easyui动态加载表格标题

在最近做的项目中涉及到了需要加载大量表格的功能,采用了easyui的datagrid,但是发现datdagrid表格标题需要手动写,这在表格多的情况是一件很麻烦的事情.经过了long long time 终于研究出来了动态加载表格标题的方法. 首先给下效果图. 刚开始本人用easyui最原始的方式将表格放入我需要它放置的位置.整体页面因为某些原因呢就不展示给大家看了. 首先大家可以去网上下载easyui的包以及easyui的中文文档.easyui包友情链接:http://www.jeasyui.

EasyUI的treegrid组件动态加载数据问题的解决办法

http://www.jquerycn.cn/a_3455 —————————————————————————————————————————————————————————————————————————————————————— 最近涉及到treegrid组件的查询,需要根据查询条件动态更新EasyUI的treegrid组件的动态加载查询结果 搜遍了treegrid源码和文档发现treegrid是扩展自datagrid和tree的,不过以往利用datagrid的reload方法加参数的 方式

java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类的私有方法么?private()方法 答:可以,class取出method,method继承executable类,executable类继承AccessibleObject类,AccessibleObject有个setAccessiable()设置这个方法是否可访问. 则设置成true,就可将pr

动态加载类并实例化对象 —— newInstance

一.Class.forName("").newInstance(); 1. Class.forName( )静态方法的目的是为了动态加载类(初始化类).在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作.因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象. 2. newInstance: 弱类型.低效率.只能调用无参构造. new: 强类型.相对高效.能调用任何public构造. 二.Class

根据JSON对象动态加载表格--大数据量

EasyUI的DataGrid加载数据的时候,如果列数过多(300列以上),数据渲染及其缓慢. JSON对象格式: 1:rowno 2:title 3:colspan 4:rowspan 5:backgroundcolor 五项属性必须设置 ar json={total:3,rows:[{'rowno':1,'title':'ceshi','colspan':1,rowspan:1,'backgroundcolor':'red'},{'rowno':1,'title':'ceshi1','col

【EasyUI】使用Jquery.load动态加载时重新渲染

EasyUI重新渲染: $.parser.parse('#app'); // 重新渲染 #app 下的元素 添加个扩展方法(方便使用): 1 $.fn.extend({ 2 Load:function (url,fun) { 3 var $this = this; 4 $(this).load(url,function (resp,status,xhr) { 5 $.parser.parse($this); 6 fun(resp,status,xhr); 7 }); 8 } 9 }); 使用Lo