hibernate 父表子表设计

1.名词介绍

          基础父表 形如 java 中的父类

          子表 形如 java 中的子类。

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

2.设计原因

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

 

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

3.具体操作方法
  1. 保证子表没有和父表相同的字段
  2. 在父表对应的model前加如下注解   (@Inheritance(strategy=InheritanceType.JOINED))
    hibernate 父表子表设计_第1张图片
  3. 在子表表对应的model前加如下注解   (@PrimaryKeyJoinColumn(name = "PK_ID") )
    hibernate 父表子表设计_第2张图片

      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 extends EntityServiceImpl {
     @Autowired
     @Qualifier ( "packModelDao" )
     @Override
     public void setBaseDao(BaseDaoImpl baseDaoImpl) {
         this .baseDaoImpl = baseDaoImpl;
     }
     /**
      *
      *

Description: 条件查询

      * @param filter 过滤器
      * @param clazz 要查询的类
      * @return 查询结果
      * @throws Exception 运行时异常
      */
     public List queryPack(Filter filter, Class 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 list;
         list = this .baseDaoImpl.findPagesListByHql(countHql + queryString, queryHql + queryString, filter);
         return list;
     }
     
     @Override
     public void insertBatch(Class clazz, List objList, String[] userInfo) {
         for (PackModel packModel : objList) {
             packModel.setMaterialType(CommonConstants.MATERIAL_TYPE_PACK);
             packModel.setDelFlag(DEL_FALSE);
             packModel.setCreateDate( new Date());
             packModel.setCreateUser(userInfo[ 1 ]);
             packModel.setValidFlag(CommonConstants.OPEN_FLAG);
             this .baseDaoImpl.save(packModel);
         }
     }
     @Override
     public void updateBatch(Class clazz, List objList, String[] userInfo) {
         for (PackModel packModel : objList) {
             packModel.setUpdateDate( new Date());
             packModel.setUpdateUser(userInfo[ 1 ]);
             this .baseDaoImpl.update(packModel);
         }
     }
     /**
      *
      *

      * Description: 真删除
      *

      *
      * @param ids 要删除的对象Id集合
      */
     public void realDeleteEntity(String[] ids) {
         for (String id : ids) {
             this .baseDaoImpl.deleteById(PackModel. class , id);
         }
     }
}
4. 总结
    经过如上操作 就做到了插入子表父表自动插入数据,更改子表父表自动更改数据,删除子表父表自动被删除,查找子表可以用HQL直接带出父表中的数据

你可能感兴趣的:(Hibernate,hibernate)