注解解决Hibernate中should be mapped with insert="false" updatable=false

参考:http://blog.sina.com.cn/s/blog_6829be5c01016pjj.html

在使用注解时,会遇到双向一对多和多对一问题:


  1. 例如order与orderitem:
  2. 在order中:
  3. /*  
  4.      * @OneToMany: 指明Order 与OrderItem关联关系为一对多关系 
  5.      *  
  6.      * mappedBy: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义, 
  7.      * 否则可能引起数据一致性的问题。 
  8.      *  
  9.      * cascade: CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作, 
  10.      * 而且这种关系是递归调用的。举个例子:Order 和OrderItem有级联关系,那么删除Order 时将同时删除它所对应的OrderItem对象。 
  11.      * 而如果OrderItem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。cascade的值只能从CascadeType.PERSIST(级联新建)、 
  12.      * CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。 
  13.      * 还有一个选择是使用CascadeType.ALL,表示选择全部四项。 
  14.      *  
  15.      * fatch: 可选择项包括:FetchType.EAGER 和FetchType.LAZY。前者表示关系类(本例是OrderItem类)在主类(本例是Order类)加载的时候 
  16.      * 同时加载;后者表示关系类在被访问时才加载,默认值是FetchType. LAZY。 
  17.      *  
  18.      */  
  19.     @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
  20.     @OrderBy(value = "id ASC")//注释指明加载OrderItem时按id的升序排序  
  21.     public Set getOrderItems() {  
  22.         return orderItems;  
  23.     }  
  24.   
  25.     public void setOrderItems(Set orderItems) {  
  26.         this.orderItems = orderItems;  
  27.     }  
  28.       
  29.     //@Temporal注释用来指定java.util.Date 或java.util.Calendar 属性与数据库类型date,time 或timestamp 中的那一种类型进行映射  
  30.     @Temporal(value = TemporalType.TIMESTAMP)  
  31.     public Date getCreatedate() {  
  32.         return createdate;  
  33.     }  
在orderItem中:
  1. /* 
  2.      * @ManyToOne指明OrderItem和Order之间为多对一关系,多个OrderItem实例关联的都是同一个Order对象。 
  3.      * 其中的属性和@OneToMany基本一样,但@ManyToOne注释的fetch属性默认值是FetchType.EAGER。 
  4.      *  
  5.      * optional 属性是定义该关联类对是否必须存在,值为false时,关联类双方都必须存在,如果关系被维护端不存在,查询的结果为null。 
  6.      * 值为true 时, 关系被维护端可以不存在,查询的结果仍然会返回关系维护端,在关系维护端中指向关系被维护端的属性为null。 
  7.      * optional 属性的默认值是true。举个例:某项订单(Order)中没有订单项(OrderItem),如果optional 属性设置为false, 
  8.      * 获取该项订单(Order)时,得到的结果为null,如果optional 属性设置为true,仍然可以获取该项订单,但订单中指向订单项的属性为null。 
  9.      * 实际上在解释Order 与OrderItem的关系成SQL时,optional 属性指定了他们的联接关系optional=false联接关系为inner join,  
  10.      * optional=true联接关系为left join。 
  11.      *  
  12.      * @JoinColumn:指明了被维护端(OrderItem)的外键字段为order_id,它和维护端的主键(orderid)连接,unique= true 指明order_id列的值不可重复。 
  13.      */  
  14.     @ManyToOne(cascade = CascadeType.REFRESH, optional = false)  
  15.     @JoinColumn(name = "order_id",referencedColumnName="orderid")  
  16.     public Order getOrder() {  
  17.         return order;  
  18.     }  
  19.   
  20.     public void setOrder(Order order) {  
  21.         this.order = order;  
  22.     }  
注意:在ManyToOne中的 @JoinColumn(name = "order_id",referencedColumnName="orderid"),这里的name = "order_id"是orderitem的外键,与order表的主键关联,如果OrderItem类当中有个属性叫oder_id,那么就会报:

should be mapped with insert="false" updatable=false
这是要在 @JoinColumn(name = "order_id",referencedColumnName="orderid")加上insertable=false updatable=false以避免字段重复映射

你可能感兴趣的:(java)