实体关系之@OneToMany

博客分类:

  • hibernate & ejb
SQL 

Order.java

Java代码  
  1. package com.entity;
  2. import java.io.Serializable;
  3. import java.util.Date;
  4. import java.util.HashSet;
  5. import java.util.Set;
  6. import javax.persistence.CascadeType;
  7. import javax.persistence.Column;
  8. import javax.persistence.Entity;
  9. import javax.persistence.FetchType;
  10. import javax.persistence.GeneratedValue;
  11. import javax.persistence.Id;
  12. import javax.persistence.OneToMany;
  13. import javax.persistence.OrderBy;
  14. import javax.persistence.Table;
  15. import javax.persistence.Temporal;
  16. import javax.persistence.TemporalType;
  17. @Entity
  18. @Table(name = "Orders")
  19. public class Order implements Serializable {
  20. private Integer orderid;//订单号
  21. private Float amount;//订单金额
  22. private Set<OrderItem> orderItems = new HashSet<OrderItem>();//订单项
  23. private Date createdate;//订单创建日期
  24. @Id
  25. @GeneratedValue
  26. public Integer getOrderid() {
  27. return orderid;
  28. }
  29. public void setOrderid(Integer orderid) {
  30. this.orderid = orderid;
  31. }
  32. @Column(name="amount")//name: 映射的列名,如果不指定映射列名,容器默认将属性名称作为的映射的数据库表列名。
  33. public Float getAmount() {
  34. return amount;
  35. }
  36. public void setAmount(Float amount) {
  37. this.amount = amount;
  38. }
  39. /*
  40. * @OneToMany: 指明Order 与OrderItem关联关系为一对多关系
  41. *
  42. * mappedBy: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,
  43. * 否则可能引起数据一致性的问题。
  44. *
  45. * cascade: CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,
  46. * 而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order 时将同时删除它所对应的OrderItem对象。
  47. * 而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。cascade的值只能从CascadeType.PERSIST(级联新建)、
  48. * CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。
  49. * 还有一个选择是使用CascadeType.ALL,表示选择全部四项。
  50. *
  51. * fatch: 可选择项包括:FetchType.EAGER 和FetchType.LAZY。前者表示关系类(本例是OrderItem类)在主类(本例是Order类)加载的时候
  52. * 同时加载;后者表示关系类在被访问时才加载,默认值是FetchType. LAZY。
  53. *
  54. */
  55. @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  56. @OrderBy(value = "id ASC")//注释指明加载OrderItem时按id的升序排序
  57. public Set<OrderItem> getOrderItems() {
  58. return orderItems;
  59. }
  60. public void setOrderItems(Set<OrderItem> orderItems) {
  61. this.orderItems = orderItems;
  62. }
  63. //@Temporal注释用来指定java.util.Date 或java.util.Calendar 属性与数据库类型date,time 或timestamp 中的那一种类型进行映射
  64. @Temporal(value = TemporalType.TIMESTAMP)
  65. public Date getCreatedate() {
  66. return createdate;
  67. }
  68. public void setCreatedate(Date createdate) {
  69. this.createdate = createdate;
  70. }
  71. /*
  72. * 添加订单
  73. */
  74. public void addOrderItem(OrderItem orderitem) {
  75. if (!this.orderItems.contains(orderitem)) {
  76. this.orderItems.add(orderitem);
  77. orderitem.setOrder(this);
  78. }
  79. }
  80. /*
  81. * 删除订单
  82. */
  83. public void removeOrderItem(OrderItem orderitem) {
  84. orderitem.setOrder(null);
  85. this.orderItems.remove(orderitem);
  86. }
  87. }

OrderItem.java

Java代码  
  1. package com.entity;
  2. import java.io.Serializable;
  3. import javax.persistence.CascadeType;
  4. import javax.persistence.Column;
  5. import javax.persistence.Entity;
  6. import javax.persistence.GeneratedValue;
  7. import javax.persistence.Id;
  8. import javax.persistence.JoinColumn;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.Table;
  11. @Entity
  12. @Table(name = "OrderItems")//name = "OrderItems",表示本实体对应数据库表 OrderItems,可选。
  13. public class OrderItem implements Serializable {
  14. private Integer id;//作为主键
  15. private String productname;//产品名称
  16. private Float price;//价格
  17. private Order order;//对应的订单
  18. /*
  19. * 无参数构造器可别忘了
  20. */
  21. public OrderItem() {
  22. }
  23. /*
  24. * 带参数的构造器,用于初始化实例变量
  25. */
  26. public OrderItem(String productname, Float price) {
  27. this.productname = productname;
  28. this.price = price;
  29. }
  30. @Id
  31. @GeneratedValue
  32. public Integer getId() {
  33. return id;
  34. }
  35. public void setId(Integer id) {
  36. this.id = id;
  37. }
  38. @Column(name="productname")
  39. public String getProductname() {
  40. return productname;
  41. }
  42. public void setProductname(String productname) {
  43. this.productname = productname;
  44. }
  45. @Column(name="price")
  46. public Float getPrice() {
  47. return price;
  48. }
  49. public void setPrice(Float price) {
  50. this.price = price;
  51. }
  52. /*
  53. * @ManyToOne指明OrderItem和Order之间为多对一关系,多个OrderItem实例关联的都是同一个Order对象。
  54. * 其中的属性和@OneToMany基本一样,但@ManyToOne注释的fetch属性默认值是FetchType.EAGER。
  55. *
  56. * optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。
  57. * 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。
  58. * optional 属性的默认值是true。举个例:某项订单(Order)中没有订单项(OrderItem),如果optional 属性设置为false,
  59. * 获取该项订单(Order)时,得到的结果为null,如果optional 属性设置为true,仍然可以获取该项订单,但订单中指向订单项的属性为null。
  60. * 实际上在解释Order 与OrderItem的关系成SQL时,optional 属性指定了他们的联接关系optional=false联接关系为inner join,
  61. * optional=true联接关系为left join。
  62. *
  63. * @JoinColumn:指明了被维护端(OrderItem)的外键字段为order_id,它和维护端的主键(orderid)连接,unique= true 指明order_id列的值不可重复。
  64. */
  65. @ManyToOne(cascade = CascadeType.REFRESH, optional = false)
  66. @JoinColumn(name = "order_id",referencedColumnName="orderid")
  67. public Order getOrder() {
  68. return order;
  69. }
  70. public void setOrder(Order order) {
  71. this.order = order;
  72. }
  73. }

转载于:https://www.cnblogs.com/chong518/p/5749325.html

@OneToMany相关推荐

  1. hibernate注解之@Onetomany、@Manytoone、@JoinColumn

    @Onetomany用于实体类与数据库表映射中少的一方,请看下面的例子. 假设一个用户只有一种角色,用户和角色是onetomany的关系 用户实体 @Entity @Table(name=" ...

  2. Entity Framework 实体关系总结:one-to-one, one-to-many, many-to-many

    通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?"血"的教训啊,刚开始使用 Entity ...

  3. hibernate 一对多(one-to-many)双向关联

    一对多(one-to-many)双向关联实例(Department- Employee) 这里的一对多双向关联是在域模型(实体对象模型)上的概念,在关系数据库中,只存在外键参照关系,而且总是由&quo ...

  4. JPA关系映射之one-to-many和many-to-one

    one-to-many(一对多)和many-to-one(多对一)双向关联 假设部门与员工是一对多关系,反过来员工与部门就是多对一关系. Dept.java类 1 public class Dept ...

  5. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model;import java.util.Date;pu ...

  6. one-to-many many-to-one 为什么只生成了一张表呢?

    one-to-many & many-to-one 为什么只生成了一张表呢? 相信我在你mapping-resources没有添加hbm.xml出错的话,多半是版本问题. 研究了半天发现,原来 ...

  7. Hibernate @OneToMany 及 @Cascade级联操作

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:团队开发中的 Git 实践个人原创+1博客:点击前往,查看更多 作者:潘佳琦 链接:https://segmen ...

  8. 九、BDB OneToMany

    (二).OneToMany关系的存储 班级类: @Entity public class Classs { @PrimaryKey String classsId; @SecondaryKey(rel ...

  9. one-to-many relationships in Grails forms

    Here's a scenario we see fairly often in our Grails applications. Parent object has a collection of ...

最新文章

  1. 如何利用Tensorflow和OpenCV构建实时对象识别程序?
  2. 大厂程序员追求深圳女老师被拉黑!原因你想不到!
  3. 样条表示---OpenGL的逼近样条函数
  4. sql语言和php,SQL语言快速入门(三)_php
  5. /和//在python中使用
  6. 全局异步和主线程异步区别、改变PlaceHolder颜色、解决键盘弹起挡住文本框问题...
  7. XCTF-MISC-新手区:give_you_flag
  8. 武汉大学计算机考研 专业课程,2018武汉大学计算机考研复试经验贴
  9. LSGO软件技术团队2015~2016学年第七周(1012~1018)总结
  10. vant 个人中心头像修改
  11. 分享几个快乐有趣的网站
  12. 蜂窝物联网与嵌入式SIM(eSIM)
  13. 高通android编译命令,高通Android源码
  14. OpenCV每日函数 thinning函数(细化)
  15. centos桌面版配置ip_CentOS7安装GNOME可视化界面和如何配置IP地址
  16. CAD转图片用什么软件?分享两种途径
  17. Bayes | 贝叶斯统计入门杂记
  18. php上传文件类型判断,PHP上传文件类型判断
  19. Python基础-IO编程-读文件read-写文件write
  20. 金蝶Kis旗舰版不能反过账?

热门文章

  1. linux shell $0怎么输出,linux shell中$0,$?,$!等的特殊用法
  2. 动态引入js只能生效一次_干货丨动态插入的script脚本执行时间
  3. python字典、列表、元祖使用场景_python学习第七讲,python中的数据类型,列表,元祖,字典,之元祖使用与介绍...
  4. android 当前置顶的控件,Android利用RecyclerView实现全选、置顶和拖拽功能示例
  5. python实训总结报告书_20172304 实验四python综合实践报告
  6. Java项目:药店信息管理系统(java+SSM+JSP+layui+maven+mysql)
  7. java clob内存溢出_java - java.sql.SQLException:ORA-01704:字符串文字太长时插入或更新 - 堆栈内存溢出...
  8. 计算机rsnge指令,计算机二级office Excel 函数复习重点
  9. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题
  10. 用户管理系统控制台版连接数据库