【问题标题】:Best Practice to declare POJO in Hibernate在 Hibernate 中声明 POJO 的最佳实践
【发布时间】:2012-09-26 06:58:04
【问题描述】:

在浏览 Hibernate Mapping 示例时,我发现,

当一个类包含 Collection 时,它在某处被声明为,

class Role{
  String roleName;
  Set<Permission> permissionName;
}

class Permission{
  String permissionName;
}

class Role{
  String roleName;
}

class Permission{
  String permissionName;
}

class RolePermission{
  String roleName;
  String permissionName;
}

hbm.xml 文件在这两种风格上有所不同。

两者通用的数据库表

Role
-----
role_id(PK) role_name

Permission  
-----------
permission_id(PK) permission_name

Role_Permission
-----------------
role_permission_id   role_id(FK)    permission_id(FK)

应该使用哪种最好的方法,以及在生成的查询中考虑休眠模式会有什么不同。

【问题讨论】:

    标签: java hibernate orm collections


    【解决方案1】:

    在这种情况下选择第一个。拥有具有一组权限的角色是这里更自然的方式。因为这就是您的业务问题所在:您希望每个角色具有多个权限。 如果不是应用程序背后的关系数据库,你甚至不会考虑使用第二种解决方案,它是对第一个类结构的分解。

    通常这就是您使用 ORM(此处为 Hibernate)的原因,以便您可以拥有更方便的类结构,而不必担心如何将其分解为关系数据库。所以肯定选择第一个。

    (你会失去什么:不能轻松地为 rolePermissions 编写查询(但这不是问题,因为它只是一个“帮助”类,它不模拟任何现实世界的东西))

    【讨论】:

      【解决方案2】:

      我会使用第一种方式,因为你会发现 permissionNamePermissionRolePermission 两个类中都有困难,因为它在第二种方式中是多余的:

      class Role{
        private Integer id;
        private String roleName;
        private Set<Permission> permissionName;
        // getter setters and necessary methods
      }
      
      // use one to many relationship from Role to Permission 
      class Permission{
        private Integer id;
        private String permissionName;
        // getter setters and necessary methods
      }
      

      【讨论】:

      • 你写的DB arch是不可行的,因为你不能有相同的权限关联到不同的角色,你需要同名的不同权限,这是多余的,你可以为一个角色添加两个相同的命名权限。这使得在类结构中添加和删除角色变得更加困难。
      • 我认为我给出的 DB 结构很好,我只想知道当 Hibernate 出现在两种声明 POJO 的样式时它是如何改变的,因为我们需要相应地编写 hbm.xml 文件。
      • 您在 Permission 表中使用了 permission_id(PK),限制它包含重复项,因此根据 Nandkumar Tekale DB Structure 只能将一个权限分配给一个 role_id
      • @JayeshPatel 是的,数据库结构很好,我认为没有什么建议采用第二种方式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多