史上22条最经典关于hibernate总结

 1、在一对多的关联关系中,为保证DML的操作性能和灵活性,其独立实体方与函数依赖实体方的cascade都设置为none,而独立实体方的inverse=true,实体ID的生成策略是影响DML操作性能的一大因素,大多数情况下,native的性能比总是高于assigned,然而实体ID的生成策略更多的时候是取决于需求和业务设计

2、对实体的修改和删除而言应该针对独立实体和函数依赖实体分别执行,而不应该使用级联API模式,因为级联API模式将可能导致更多的IO操作使其降低性能和操作弹性

3、实体的修改通常是先检索,再修改托管实体属性,最后再对托管实体(session关闭之后,与session失去关联的实体)进行修改

4、实体的删除通常也是先检索,再删除该实体即可

5、在多对多的关联关系中,为保证DML的操作性能和灵活性,将映射实体双方的cascade=none,而inverse=false,实体ID的生成策略是影响DML操作性能的一大因素,大多数情况下,native的性能比总是高于assigned,然而实体ID的生成策略更多的时候是取决于需求和业务设计

6、对实体的修改和删除而言应该针对双方实体分别执行,而不应该使用级联API模式,因为多对多的关联映射中无所谓主从实体,使用级联级联API模式将可能导致更多的IO操作使其降低性能和操作弹性

7、实体的修改通常是先检索,再修改托管实体属性,最后再对托管实体(session关闭之后,与session失去关联的实体)进行修改,如果程序中组合了另一方实体则此操作会自动关联修改中间表外键

8、实体的删除通常也是先检索,再删除该实体,此操作不聚合API模式即可自动删除中间表中关联外键;但是因为session中delete执行流程的原因,在实体ID生成策略为assigned时导致删除实体之前执行更多的IO检查操作,于是某些时候出现操作性能上的考虑直接使用瞬态实体操作模式进行删除来避免Hibernate执行更多的select检查

9、添加主键时必须注意ID生成策略,如果ID生成策略为native则保持实体ID值为null,如果ID生成策略为assigned则必须在保存之前指定实体的ID值(不能为null)

10、删除实体时如果实体ID生成策略为native则将直接执行delete操作,如果ID生成策略是assigned则先检查缓存再检查数据库,在记录存在的情况下执行delete操作

11、修改操作一般是先查询得到该实体,然后再删除该实体

12、如果使用ThreadLocalSessionContext来完成查询操作,是否需要事务上下文的支持

13、Hibernate的缓存机制分为一级缓存、二级缓存和查询缓存,其中一级缓存是Hibernate自带的,且是固有不可撤销的,Hibernate提供了对二级缓存支持的接口
   
14、查询缓存是二级缓存的一部分,它的存在需要二级缓存的支
   持

15、一级缓存是线程安全的,二级缓存是线程不安全的,它需要使用Hibernate的事务策略来管理缓存中的数据


16、EHCache可以与Hibernate无缝集成,该缓存工具提供声明式配置和编程模式两种,我们常用的是声明式配置模式

 
 17、Hibernate中为考虑性能和操作效率起见,大多数情况使用SQLQuery接口代替通用Query接口执行原生SQL查询

18、增删改等DML操作一般使用Session来完成,执行新增操作一般是调用Session中的save方法,这个方法便于返回数据库生成的主键,
      在批  量执行新增和修改时应该在一级缓存限额内实时刷冲数据到磁盘并清空一级缓存;执行批量新增还应该临时关闭二级缓存,避免数         据从一级缓存写入二级缓存中

19、如果通过实体的getter方法获取多个关联实体则应该配置batch-size属性,使用批量装载模式来避免过多的SQL查询引起的低效IO操作

20、为了使SQL与工程项目解藕,我们通常将SQL放在hbm映射配置文件中,编程人员应该养成良好的这种习惯和作风

21、Hibernate有两种锁机制:悲观锁和乐观锁,悲观锁的实现依赖于数据库本身,乐观锁依赖于应用系统施加的版本控制;其中Hibernate推荐使用乐观锁版本隔离并发事务


22、Hibernate中可以在hibernate.cfg.xml中配置连接池,连接池的作用和C3P0实现的连接池各项参数请参考JavaWeb阶段的讲解
 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HibernateD 是 D 语言的 ORM 框架,类似 Java 的 Hibernate,示例代码:import hibernated.core; // Annotations of entity classes class User {     long id;     string name;     Customer customer;     @ManyToMany // cannot be inferred, requires annotation     LazyCollection!Role roles; } class Customer {     int id;     string name;     // Embedded is inferred from type of Address     Address address;     Lazy!AccountType accountType; // ManyToOne inferred     User[] users; // OneToMany inferred     this() {         address = new Address();     } } @Embeddable class Address {     string zip;     string city;     string streetAddress; } class AccountType {     int id;     string name; } class Role {     int id;     string name;     @ManyToMany // w/o this annotation will be OneToMany by convention     LazyCollection!User users; } // create metadata from annotations EntityMetaData schema = new SchemaInfoImpl!(User, Customer, AccountType,                                   T1, TypeTest, Address, Role, GeneratorTest); // setup DB connection factory MySQLDriver driver = new MySQLDriver(); string url = MySQLDriver.generateUrl("localhost", 3306, "test_db"); string[string] params = MySQLDriver.setUserAndPassword("testuser", "testpasswd"); DataSource ds = ConnectionPoolDataSourceImpl(driver, url, params); // create session factory Dialect dialect = new MySQLDialect(); SessionFactory factory = new SessionFactoryImpl(schema, dialect, ds); scope(exit) factory.close(); // Create schema if necessary { // get connection Connection conn = ds.getConnection(); scope(exit) conn.close(); // create tables if not exist factory.getDBMetaData().updateDBSchema(conn, false, true); } // Now you can use HibernateD // create session Session sess = factory.openSession(); scope(exit) sess.close(); // use session to access DB // read all users using query Query q = sess.createQuery("FROM User ORDER BY name"); User[] list = q.list!User(); // create sample data Role r10 = new Role(); r10.name = "role10"; Role r11 = new Role(); r11.name = "role11"; Customer c10 = new Customer(); c10.name = "Customer 10"; User u10 = new User(); u10.name = "Alex"; u10.customer = c10; u10.roles = [r10, r11]; sess.save(r10); sess.save(r11); sess.save(c10); sess.save(u10); // load and check data User u11 = sess.createQuery("FROM User WHERE name=:Name").                            setParameter("Name", "Alex").uniqueResult!User(); assert(u11.roles.length == 2); assert(u11.roles[0].name == "role10" || u11.roles.get()[0].name == "role11"); assert(u11.roles[1].name == "role10" || u11.roles.get()[1].name == "role11"); assert(u11.customer.name == "Customer 10"); assert(u11.customer.users.length == 1); assert(u11.customer.users[0] == u10); assert(u11.roles[0].users.length == 1); assert(u11.roles[0].users[0] == u10); // remove reference u11.roles.get().remove(0); sess.update(u11); // remove entity sess.remove(u11); 标签:HibernateD
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子兮曰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值