使用休眠或不?(Use Hibernate or not?)

2019-09-17 08:41发布

嗨,我有我想从表中选择数据,如果没有找到过检查下一个值等再次产生新的价值,并插入到数据库,然后循环统计数据的应用程序。 这将做的时间十亿左右为一个新的请求。

所以,我应该使用hibernate或简单的JDBC

在休眠我应该使用

    session.saveOrUpdate(obj);

要么

        session.save(obj);

还有一件事我想问的是,每个插入我一定要初始化我的表类对象( new Mytable )? 只有设置的值会做什么?

喜欢

   MyTable obj=new Mytable();
    obj.setName("dasd");
    obj.set...

obj.save();

或可我只是初始化一次

 `MyTable obj=new Mytable();`

and in a loop put
for(...
obj.setName("dasda");
obj.save

)

Answer 1:

我假设/希望around a billion times是一个比喻,因为如果不是这样,那是肯定有不少的操作,所以你可能要重新检查设计。

话虽这么说,作为你的第一个问题,我会建议休眠,因为它基本上是建立在JDBC之上,并提供了一些更简便的事情,如让你编写独立于数据库的查询,这意味着你不需要重新编写查询你应该改变你的数据库。

根据你的第二个问题,这真的取决于你想要做什么:

根据这个API:

saveOrUpdate

无效saveOrUpdate(Object对象)抛出HibernateException的

要么保存(对象)或更新(Object)将给定的实例,这取决于未保存值检查的分辨率(参见未保存的值检查讨论中的手册)。 此操作级联到关联的实例,如果所述关联映射与级联=“保存更新”。

参数:对象 - 包含新的或更新状态的瞬态或分离实例抛出:HibernateException的另请参见:保存(java.lang.Object中),更新(Object对象)

序列化的保存(Object对象)抛出HibernateException的

持续给定的瞬态的实例中,首先分配一个生成的标识符。 (或者使用所述标识符属性的当前值,如果使用所分配的发电机。)如果关联与级联=“保存更新”映射此操作级联到关联的实例。 参数:object - 一个持久类返回的瞬态的实例:所产生的标识符抛出:HibernateException的

根据你的第三个问题,你应该提供更多的信息。 你也能设置值,以避免编写null值到您的数据库,但这真的取决于你的申请,并在其将要实施的背景下。



Answer 2:

  1. Hibernate是一个OR映射工具 。 简单的说,它客体化在应用程序中的数据层 ,这样你就不必处理与数据库交互的复杂性。

  2. 现在话说回来,存在这样的情况,其中,休眠可能不是很好的选择。

  3. 如果你的模式是非常简单的 (小于8-10表),并没有它们之间非常复杂的关系,则Hibernate使用将是这种情况略有矫枉过正。

  4. 如果数据的你在想工作的尺寸非常大(MN / BN的顺序),也有Hibernate使用中的使用是不鼓励。 好老JDBC是在这里更好

  5. 如果应用程序使用了大量的静态数据 ,那么缓存将是一个不错的选择,透明的休眠支持缓存。

所以,这一切都取决于你有什么类型的场景。 您可以随时建立saveOrUpdate(obj); 使用JDBC为好。



Answer 3:

1) So should i use hibernate or simple JDBC ??

如果你知道你的方式围绕冬眠我会说去了,如果你有足够的时间和资源来学习它,否则只能使用它。 事实是,如果你使用它好,它可以是你最好的朋友,否则只会是痛苦的根源。

2) and in hibernate should i use

    session.saveOrUpdate(obj);
or

    session.save(obj);

对于这个问题,你可能需要阅读中发现的JavaDoc 这里 。 一个片段:

save(Object object) 
Persist the given transient instance, first assigning a generated identifier.

saveOrUpdate(Object object) 
    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).

第三个问题我真的不明白,请展开它。



Answer 4:

由于大部分的您的问题上面已经回答了,让我来回答你的最后一个问题。 是的,你必须创建一个新的对象,每一个新的对象(理想情况下,如果没有相关的依赖)将在数据库新行。 所以,你必须创建一个新的对象 - >设定值给它 - >其与Hibernate的Session关联 - >和db.If保存它,你都希望在数据库中插入不同的行那么是的,你必须创建不同的对象。

希望这可以帮助。



Answer 5:

还要注意的Hibernate的地毯下技术方面的问题。

  1. 它建立反射模式调用性能(无论是getter和setter或字段
  2. 休眠反正生成SQL查询,并从读出的数据集的数据,然后,以分配所查询的超时值调用反射方法。
  3. 如果您填写这是一个密钥 - Hibernate会首先把它用于查询形成任何财产(但一次操作)

所以,休眠加载和持久对象时,确实至少额外操作每日两次。 Really-它更多。 因此,一旦你使用的工作与功能,不worklflow模式下的数据库,你可以读取数据集的数据(Hibernate会做同样的),并保存在本地变量。 具有可变的工作比对象使用查找表更快。

然而,一个环境:任何JPA类映射到表。 这是件好事,一旦你从头开始,或者如果数据库中有合适的设计建立自己的数据库。 如果你需要从数合并域O表? 然而,Hibernate有@OneToOne注释插入和对象对应于另一个表。 然而一旦Hibernate会做工作的周期为一到一个链接对象,当你只需要几个字段。

在nutshell-计算操作如果性能是最终的标准:你必须和至少需要2次调用数据集。 Hibernate是重工作流操作,当你有因为好处:

  1. 你很多次,从数据集读取对象的字段不
  2. 这是更好地释放数据集是比任何数据对象重得多


文章来源: Use Hibernate or not?