Hibernate映射关联(2)
来源:互联网 发布:网络包工头在哪找活 编辑:程序博客网 时间:2024/06/05 04:32
Hibernate映射关联(2)
1、一般情况下,为了方便维护数据,在多对多中会生成一张中间表。
情况一:如果中间表仅仅是做关联用的,它里面仅有2个外键做联合主键,则使用ManyToMany(不用写中间表的Model,只需要写出两张主表的model即可)。
情况二:如果中间表还有其他属性,例如订单和产品,通常还会有单价和数量会作为中间表的属性。这时,我们不能再用ManyToMany。
我们必须把多对多拆成两个一对多。
使用的hiberenate为5.2.9
Order.java
package com.ljs.bean;import java.util.HashSet;import java.util.Set;public class Order { private Integer id; private double total; private String realname; private String phone; private String address; private String postcode; private Set<OrderItem> orderitems = new HashSet<OrderItem>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public double getTotal() { return total; } public void setTotal(double total) { this.total = total; } public String getRealname() { return realname; } public void setRealname(String realname) { this.realname = realname; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPostcode() { return postcode; } public void setPostcode(String postcode) { this.postcode = postcode; } public Set<OrderItem> getOrderitems() { return orderitems; } public void setOrderitems(Set<OrderItem> orderitems) { this.orderitems = orderitems; }}
Product
package com.ljs.bean;import java.util.HashSet;import java.util.Set;public class Product { private Integer id; private String name; private double price; private String description; private Set<OrderItem> orderitems = new HashSet<OrderItem>(); public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Set<OrderItem> getOrderitems() { return orderitems; } public void setOrderitems(Set<OrderItem> orderitems) { this.orderitems = orderitems; }}
OrderItem
package com.ljs.bean;public class OrderItem { private Integer id; private Order order; private Product product; private Integer quantity; private double purchasePrice; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public double getPurchasePrice() { return purchasePrice; } public void setPurchasePrice(double purchasePrice) { this.purchasePrice = purchasePrice; }}
Order.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ljs.bean"> <class name="Order" table="orders" > <id name="id" type="integer"> <generator class="native"/> </id> <property name="total" type="double"/> <property name="realname" type="string" length="12"/> <property name="phone" type="string" length="11"/> <property name="address" type="string" length="50"/> <property name="postcode" type="string" length="12"/> <set name="orderitems" table="OrderItem" cascade="save-update" lazy="false"> <key column="oid"/> <one-to-many class="OrderItem"/> </set> </class></hibernate-mapping>
Product.hbm.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ljs.bean"> <class name="Product" table="products"> <id name="id" type="integer"> <generator class="native"/> </id> <property name="name" type="string" length="20"/> <property name="price" type="double"/> <property name="description" type="string" length="50"/> <set name="orderitems" table="OrderItem" lazy="false"> <key column="pid"/> <one-to-many class="OrderItem"/> </set> </class> </hibernate-mapping>
OrderItem.xml
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.ljs.bean"> <class name="OrderItem" table="OrderItem"> <id name="id" type="integer"> <generator class="native"/> </id> <property name="quantity" type="integer" length="4"/> <property name="purchasePrice" type="double"/> <many-to-one name="order" class="Order" column="oid" lazy="false"/> <many-to-one name="product" class="Product" column="pid" cascade="save-update" lazy="false"/> </class> </hibernate-mapping>
Test.java
package com.ljs.test;import com.ljs.bean.Order;import com.ljs.bean.OrderItem;import com.ljs.bean.Product;import com.ljs.dao.OrderDao;import com.ljs.dao.impl.OrderDaoImpl;public class Test { static OrderDao o = new OrderDaoImpl(); public static void main(String[] args) { // TODO Auto-generated method stub //订单一 Order o1 = new Order(); o1.setRealname("李浩然"); o1.setPostcode("510990"); o1.setAddress("广州华软"); o1.setPhone("87818998"); //订单二 Order o2 = new Order(); o2.setRealname("李明"); o2.setPostcode("510000"); o2.setAddress("广州中大"); o2.setPhone("87818998"); //产品一 Product p1 = new Product(); p1.setName("笔记本电脑"); p1.setPrice(6780); p1.setDescription("散热性能好"); //产品二 Product p2 = new Product(); p2.setName("32彩电"); p2.setPrice(3699); p2.setDescription("性价比好"); //产品三 Product p3 = new Product(); p3.setName("39彩电"); p3.setPrice(3600); p3.setDescription("性价比好"); //订单记录 OrderItem oi1 = new OrderItem(); OrderItem oi2 = new OrderItem(); OrderItem oi3 = new OrderItem(); OrderItem oi4 = new OrderItem(); //一个订单有多条商品记录 oi1.setOrder(o1); oi1.setProduct(p1); oi1.setQuantity(100); oi1.setPurchasePrice(6000); oi2.setOrder(o1); oi2.setProduct(p2); oi2.setQuantity(200); oi2.setPurchasePrice(3000); o1.getOrderitems().add(oi1); o1.getOrderitems().add(oi2); //一个商品有多条商品记录 oi3.setOrder(o2); oi3.setProduct(p3); oi3.setQuantity(30); oi3.setPurchasePrice(3300); oi4.setOrder(o2); oi4.setProduct(p1); oi4.setPurchasePrice(6200); oi4.setQuantity(60); o2.getOrderitems().add(oi3); o2.getOrderitems().add(oi4); //持久化 o.addOrder(o1); o.addOrder(o2); //查询 Order sorder = o.findOrderById(1); if(sorder!=null) { double fmoney = 0.0; for(OrderItem oi:sorder.getOrderitems()) { fmoney+=(oi.getPurchasePrice()*oi.getQuantity()); } System.out.println("订单号:"+sorder.getId()); System.out.println("总花费:"+fmoney+"\n"+"购买了以下商品:"); for(OrderItem item:sorder.getOrderitems()) { System.out.println("商品名:"+item.getProduct().getName()); } } }}
出现的问题:
1、order是个sql关键字,所以不能用order作为表名,有两种方法修改表名为默认的类名,一种是在映射文件的class中直接设置属性table为其他表名。第二种是使用注解。会报错
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order (total, realname, phone, address, postcode) values (0.0, '�浩然', '878' at line 1
2、当你在查询时候,要用到lazy=“false”,懒加载。默认都是为true,及查询一个主对象时,不会加载其关联的属性。而且得在双方的关联配置
中设置lazy=“false”。否则会报错。
failed to lazily initialize a collection of role: com.ljs.bean.Order.orderitems, could not initialize proxy - no Session
阅读全文
0 0
- hibernate 关联映射(2)
- Hibernate映射关联(2)
- Hibernate关联映射2
- Hibernate关联映射(转)
- Hibernate的映射(关联)
- Hibernate关联映射(5)
- Hibernate关联映射(1)
- hibernate映射一对一关联(主键关联)
- Hibernate关联关系映射(一对一关联)
- 关联映射(hibernate映射)
- Hibernate关联关系映射(多对一关联映射)
- Hibernate 、多表关联映射-组件关联映射(component)
- 【Hibernate框架】关联映射(一对一关联映射)
- 【Hibernate框架】关联映射(多对多关联映射)
- Hibernate(2)关联映射之多对一
- Hibernate关联映射(2)2015-07-11
- Hibernate关联映射-----一对一关联
- Hibernate集合映射、关联映射
- JAVA | 15
- 怎样在虚拟机上安装Ubuntu17.04系统
- 第一个java程序的编译和运行(linux下安装JDK)------一次编译,到处运行
- 3、 find_element
- 参考文献格式国家标准(GB-T 7714-2005)
- Hibernate映射关联(2)
- FFMPEG filter使用实例(实现视频缩放,裁剪,水印等)
- Django Form表单
- 171115 杂项-可见字符组成的Shellcode
- 类的加载过程
- D. Ralph And His Tour in Binary Country
- 类加载机制
- 3分钟教你成为JVM的尖子生
- Java性能权威指南.pdf 免费下载