Hibernate级联那些事儿(JPA框架)

 在开发后台JAVA代码的时候(基于ECAFE_APPLCATION 2.2),联级关联如果用到@ManyToOne(cascade = CascadeType.ALL)的时候,会在控制台出现异常错误。而我用@ManyToOne(cascade = CascadeType.REFRESH)的时候,则不报错正常。出现这一情况,我也不知道怎么回事儿,不过使用我们有必要去了解联级操作。
1.对Hibernate做一个简单的说明。

   JPA中一对多和多对一双向关系中,多的一方为关系维护端 。有mappedBy的一方为关系被维护端。关系维护端负责外键纪录的更新 ,关系被维护端是没有权力更新外键纪录的。只能通过关系维护端设置与关系被维护端的关系。


@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.REFRESH,

            CascadeType.MERGE, CascadeType.REMOVE, CascadeType.ALL }, fetch = FetchType.EAGER, mappedBy = "order")


cascade:

设置级联操作,对JPQL语句进行的操作没有任何影响

CascadeType.PERSIST对应实体管理器的persist()方法

CascadeType.REFRESH对应实体管理器的refresh()方法

CascadeType.MERGE对应实体管理器的merge()

方法CascadeType.REMOVE对应实体管理器的remove()方法


CascadeType.ALL对应实体管理器的以上方法:persist()、refresh()、merge()、remove()方法


fetch:设置是否延迟加载,FetchType.LZAY为延迟加载, FetchType.EAGER时立即加载。

如果加载的是多的一方的话,默认的是延迟加载,否则是加载。


@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = false)
@JoinColumn(name = "order_id")optional:代表外键字段是否可以为空。true可以为空,false不可以为空。@JoinColumn(name = "order_id"):设置关联外键字段的名称。


2.实例

  2.1实体类 AmmeterEntity,如下所示,它注入了表结构,有表名还有字段名,还有外键值。

@Entity
@Table(name = "sems_ammeter_data",uniqueConstraints = {@UniqueConstraint(columnNames={"uid"})})
public class AmmeterEntity extends AbstractEntity {

        /**
         * 生成序列号
         */
        private static final long serialVersionUID = -6904953988288019906L;


        /**
         * 电表编号
         */
        public String uid;


        /**
         *  电表对应的集中器
         */
        public Concentrator concentrator;
       
    /**
     * @return the uid
     */
    @Column(name = "uid")
        public String getUid() {
                return uid;
        }
    /**
     * 使用CascadeType.REFRESH方式
     * @return concentrator
     */
        @ManyToOne(cascade = CascadeType.REFRESH)
        @JoinColumn(name = "concentrator_id")
        public Concentrator getConcentrator() {
                return concentrator;
        }
        /**
         * 
         * @Description: 
         * @author xuzhongming
         * @version
         * @param uid
         * 
         */
        public void setConcentrator(Concentrator concentrator) {
                this.concentrator = concentrator;
        }    
}

2.2 举DB层实现的一个代码片断,如下所示:
@Override
        public List<AmmeterEntity> getAmmeterByConcentratorId(Long concentratorId)
                        throws Exception {
                 //使用占位符的方式
        String hql = " from AmmeterEntity ammeter where ammeter.concentrator.id = :concentratorId   ";
        String[] params = {"concentratorId"};
          
       Object[] args = { concentratorId };
       List<AmmeterEntity> ammeterList = getHibernateTemp().findByNamedParam(hql,  params, args);
                return ammeterList;
        }

注意:这种查询方式在HQL查询方式中已经说过,我们可以看到hql的查询语句结构,很清楚的知道,这个id值就是该电表所属的集中器的主键值。可以查询出该集中器下面所属的电表列表。

我上面介结的是多对一单向关联的一个例子,如果要深入学习级联方式,可以参才JPA框架,它非常强大,已经去掉了写*.hbm.xml文件了,直接通过注入的方式,将类同表结构合二为一。

(完,待续.......)

你可能感兴趣的:(Hibernate级联那些事儿(JPA框架))