0 0

针对hibernate应用的表设计,最好设计一个非逻辑主键id吗?大家怎么做的啊5

hibernate的应用,一定需要主键的。

 

很多书上或网页都推荐针对hibernate的表设计时,设计一个独立的主键id,跟业务逻辑无关系的。但是我在实际应用中,发现有些业务涉及主外时,使用跟业务逻辑有关的主键很方便。


问题补充:谢谢各位,这几天忙去了。
确实主键和业务脱离,能增加灵活性。
现在,我总结下,看对不对
用独立主键:
优点:
1. 能和业务逻辑解偶,如后期的业务变化,主键不会变化(这个比较重要,一般程序里getId()被用到的地方很多)
2. 知道id的情况,访问数据比较快,直接,且方便做成通用处理(各表主键id同名)
缺点:
1. 有时访问数据不大方便,应用上经常关心业务数据,在这种情况下,如果要得到记录,需要先得到id,再利用id,得到记录
2. 业务应用上,业务主键字段用于查询比较多,通常会建立索引,这样主键id也有索引,索引多了,增加了空间,影响更新速度
3. 如要对数据做主外键(业务上的数据约束),由于表主键只有一个,这时建立不了约束

-----
对数据完整性约束要求较高的情况下(如数据比较总重要,不能出错的情况下),用业务逻辑字段做主键。其它情况用独立主键。
另外,用独立主键时,在hibernate中,可以建立维护主外键关系(这样应该可以吧,相当在应用层约束数据完整性)
2013年4月22日 14:01

3个答案 按时间排序 按投票排序

0 0

采纳的答案

我的经验:
1、使用自增流水号 作为主键  少用复合主键
比如 a表是一个复合主键表 b参照a 那么b必须也有那两个

2、自增主键 可以优化查询
因为主键是自增的 所以比如查询时 可以带上 最后一次的id  这样查询效率会提高不少

3、复合主键 改成唯一索引 进行约束即可

4、好切分 
比如我要分表 如果简单的话 可以直接根据id 取模划分 简单 而且 均匀

2013年4月22日 15:47
0 0

比如说支付宝订单表,用订单号做主键,理论上完全可以,但不推荐,不到万不得已的时候不要用(比如复合主键)。业务逻辑主键引入库表,使得底层数据库表和业务逻辑想耦合,之后业务逻辑的变动很可能对底层数据库结构产生连带影响,在某些情况下,这种变更的代价难以承受

2013年4月22日 15:01
0 0

我的经验是相反的,不要和业务挂上钩,好些。特别是hibernate这种自动化程度高的。

因为业务是会变的。比如

现在说这个表每天只可能有一条数据,于是主键用'yyyyMMdd'了。
可是例外发生了,一天可以有多条,于是主键就得改,改主键就比较麻烦。特别是如果还有外键带着,一团糟!

所以我推荐和业务脱离,如果业务要求严格。
宁可用制约(最后也程序中处理,除非该应用偏向DB。)代替,也别绑上主键等。

2013年4月22日 14:45

相关推荐

    使用hibernate做的一个登录的小实例,代码大部分都是自动生成

    在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够更专注于业务逻辑而非底层的SQL语句。本实例通过Hibernate来创建一个登录系统,旨在帮助初学者理解如何将...

    hibernate 自己做的实例

    Hibernate,作为Java领域中的一个强大对象关系映射(ORM)框架,为开发者提供了便捷的数据访问层解决方案,将数据库操作与业务逻辑解耦,大大简化了Java应用的开发过程。本文将深入探讨我在实践中对Hibernate的理解...

    hibernate实现一对一得关联

    在Java企业级开发中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑。本文将深入探讨如何使用Hibernate来实现一对一(OneToOne)的关联映射,这对于理解和构建复杂的...

    使用hibernate做的多对多例子

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。本示例将详细解析如何使用Hibernate来实现多对多关系。 一、Hibernate...

    使用Hibernate开发租房系统78.

    在IT行业中,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是底层的数据存取细节。本教程“使用Hibernate开发租房系统78”聚焦于利用Hibernate来构建一个...

    SpringMVC hibernate 做的问答系统,界面比较简陋,初学的可以借鉴一下

    这是一个基于SpringMVC和Hibernate框架构建的简单问答系统,适合初学者学习和借鉴。这个系统可能没有华丽的界面,但其核心在于后端逻辑的实现,对于理解如何将这两个技术结合来处理Web应用中的数据交互有很好的示例...

    hibernate-release-4.2.2.Final.zip

    Hibernate是一个开源的ORM框架,它通过将Java类与数据库表进行映射,实现了对象的持久化。这使得开发者无需编写大量的SQL语句,只需关注业务逻辑,从而提高了开发效率。在Hibernate 4.2.2.Final版本中,包含了对JPA...

    关于hibernate的实例

    4. **持久化类与主键**:`@Entity`注解标记一个类为持久化类,`@Table`定义了对应的数据库表名,`@Id`注解定义主键字段,例如,通常会有一个名为id的属性被标记为主键。 5. **Session工厂与Session**:...

    Hibernate面试题-详尽解析

    - **实现原理**: 在使用`identity`方式时,开发者需要在数据库表的设计中为主键字段指定自动增长属性(例如MySQL中的`AUTO_INCREMENT`)。 - **比较分析**: - **灵活性**: `native`提供更高的灵活性,因为它可以...

    hibernate+jpa注解实现最简单的增删改查

    这里`@Entity`表示这是一个JPA实体,`@Table`指定对应的数据库表名,`@Id`定义主键,`@GeneratedValue`定义主键生成策略,`@Column`定义字段映射到表的列。 3. **Repository接口** 创建一个继承自JpaRepository的...

    hibernate的一点总结

    Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式操作数据库,将Java类与数据库表进行映射,从而避免了直接编写SQL语句的繁琐工作。这个框架的核心在于将业务对象(即Java对象...

    Hibernate3.2官方中文参考手册

    Hibernate作为一个强大的对象关系映射(ORM)框架,能够帮助开发者将数据库操作与业务逻辑进行解耦,提升开发效率并降低维护成本。 在Hibernate3.2版本中,有许多关键特性值得深入探讨。首先,它提供了更加完善的...

    hibernate jar包和简单的学习例子

    而"本人做的一个简单的实例"则意味着包含了一个实际运行的代码示例,帮助初学者了解如何在项目中集成并使用Hibernate。 **Hibernate框架介绍** Hibernate是一个开源的ORM框架,它的主要功能是将Java类与数据库表...

    hibernate 配置

    在使用Hibernate时,我们通常需要创建一个名为`hibernate.cfg.xml`的配置文件,该文件是Hibernate应用的主配置源,包含了数据库连接、方言、缓存等关键设置。以下是一份基本的`hibernate.cfg.xml`配置示例: ```xml...

    hibernate教程

    Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。本教程将引导你深入理解Hibernate的核心概念和实践应用,帮助你提升开发效率。 **一、Hibernate简介** Hibernate 是...

    hibernate小程序

    【hibernate小程序】是一个基于Hibernate框架开发的小型应用程序,主要功能是对用户数据进行基本的CRUD(创建、读取、更新、删除)操作。Hibernate是Java领域内广泛使用的对象关系映射(ORM)框架,它允许开发者用...

    基于Annocation的spring-hibernate配置

    Hibernate支持 Annotation 配置,使得我们可以直接在实体类上定义数据表映射,如`@Entity`表示实体类,`@Table`指定对应的数据表,`@Id`标识主键,`@GeneratedValue`管理主键生成策略等。 整合Spring和Hibernate,...

    达内培训做的当当网

    结合【标签】"hibernate struts2",我们可以看出该项目着重于使用Hibernate进行数据持久化,同时利用Struts2处理前端请求和业务逻辑,构建了一个完整的Java Web应用。在实际项目中,开发者还需要掌握HTML、CSS、...

    hibernate 增删改查的操作

    3. **实体类(Entity):** 在 Hibernate 中,每个数据库表对应一个 Java 类,类中的字段对应表的列。使用 `@Entity` 注解标记此类为实体,`@Table` 注解指定对应的表名。 4. **主键(Primary Key):** 使用 `@Id`...

    J2EE企业级项目开发-1期 04 Hibernate使用经验.doc

    1. **独立的ID设计**:在设计数据库时,推荐为每张表创建一个与业务逻辑无关的主键ID,例如自增的序列号。这样做可以确保在数据量增长时,能够更方便地为这些ID字段添加索引,提高查询效率。同时,如果业务需求发生...

Global site tag (gtag.js) - Google Analytics