hibernate 父表子表设计

来源:互联网 发布:局域网共享端口 编辑:程序博客网 时间:2024/06/15 23:05
1.名词介绍

          基础父表 形如 java 中的父类

          子表 形如 java 中的子类。

注意: 子表不能有和父表相同的字段。

2.设计原因

          有时会出现 你 插入一条子表数据 就 要同步插入一条父表数据,修改子表父表也要跟着修改,删除也是一样,这样的会导代码写的非常麻烦。

 

          解决办法: 使用Hibernate 关系 解决

3.具体操作方法
  1. 保证子表没有和父表相同的字段
  2. 在父表对应的model前加如下注解   (@Inheritance(strategy=InheritanceType.JOINED))

  3. 在子表表对应的model前加如下注解   (@PrimaryKeyJoinColumn(name = "PK_ID") )

      4.子表对应service 增删改查 操作 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
@Service("PackModelService")
public class PackModelService extendsEntityServiceImpl<PackModel> {
    @Autowired
    @Qualifier("packModelDao")
    @Override
    publicvoid setBaseDao(BaseDaoImpl<PackModel, String> baseDaoImpl) {
        this.baseDaoImpl = baseDaoImpl;
    }
    /**
     *
     * <p>Description: 条件查询</p>
     * @param filter 过滤器
     * @param clazz 要查询的类
     * @return 查询结果
     * @throws Exception 运行时异常
     */
    publicList<PackModel> queryPack(Filter filter, Class<PackModel> clazz)throws Exception {
        String countHql;
        countHql ="select count(*) from PackModel ";
        String queryHql;
        queryHql ="from PackModel ";
        StringBuilder queryString;
        queryString =new StringBuilder(" where 1=1 ");
        if(checkValid("packNo", filter.getQueryMap())) {
            queryString.append(" and lower(materialNo) like :packNo");
        }
        if(checkValid("packModel", filter.getQueryMap())) {
            queryString.append(" and lower(materialModel) like :packModel");
        }
        if(checkValid("packName", filter.getQueryMap())) {
            queryString.append(" and lower(materialName) like :packName");
        }
        //执行查询
        List<PackModel> list;
        list =this.baseDaoImpl.findPagesListByHql(countHql + queryString, queryHql + queryString, filter);
        returnlist;
    }
     
    @Override
    publicvoid insertBatch(Class<PackModel> clazz, List<PackModel> objList, String[] userInfo) {
        for(PackModel packModel : objList) {
            packModel.setMaterialType(CommonConstants.MATERIAL_TYPE_PACK);
            packModel.setDelFlag(DEL_FALSE);
            packModel.setCreateDate(newDate());
            packModel.setCreateUser(userInfo[1]);
            packModel.setValidFlag(CommonConstants.OPEN_FLAG);
            this.baseDaoImpl.save(packModel);
        }
    }
    @Override
    publicvoid updateBatch(Class<PackModel> clazz, List<PackModel> objList, String[] userInfo) {
        for(PackModel packModel : objList) {
            packModel.setUpdateDate(newDate());
            packModel.setUpdateUser(userInfo[1]);
            this.baseDaoImpl.update(packModel);
        }
    }
    /**
     *
     * <p>
     * Description: 真删除
     * </p>
     *
     * @param ids 要删除的对象Id集合
     */
    publicvoid realDeleteEntity(String[] ids) {
        for(String id : ids) {
            this.baseDaoImpl.deleteById(PackModel.class, id);
        }
    }
}
4. 总结
    经过如上操作 就做到了插入子表父表自动插入数据,更改子表父表自动更改数据,删除子表父表自动被删除,查找子表可以用HQL直接带出父表中的数据
0 1
原创粉丝点击