NoSQL炒作无处不在。许多初选择卡桑德拉/蒙哥大/HBASE/Redis/…。在这里,我将讨论为什么他们应该坚持一个SQL解决方案-MySQL或PostgreSQL。
在我桑德拉,我详述了为什么I决定不使用它。现在,我观看了十几篇演讲,后来又读了几十篇文章,我可以详细解释为什么我认为这通常不是一个好主意。
NoSQL是伟大的“网络规模”。这是NoSQL传道者的口头禅。但NoSQL解决方案的一个重要缺点是,在NoSQL(至少对Cassandra和HBASE而言)中,你问什么问题。大多数消息来源(Twitter、Facebook、Rackspace)都提到了这一点。你不能随便质疑任何你喜欢的东西。另一方面,关系模型允许您定义模型,然后询问任何出现在您脑海中的问题(查询)。我敢打赌,一家初创公司还不知道它要问它的数据存储库的所有问题。
另一件事是可用性。所有开发人员都熟悉SQL和关系模型。初创企业必须尽快进入公众市场。为什么要费心学习新的范式、新的平台和新的工具(如果你幸运地拥有了工具)?
现在让我们回到网络规模。创业公司不需要网络规模。真的。你不会一夜之间就有一百万用户。Twitter没有,Facebook没有。如果一切顺利,你可以逐步升级你的数据模型,以满足新的需求。Twitter和Facebook就是这样做的。他们从MySQL开始。哦,顺便说一下,Twitter还在用MySQL做最重要的事情--tweet。现在,如果你比他们有更多的数据,你就..。脸书?
https://movie.douban.com/doulist/145579081/
总之--不要为了一些虚构的“千兆字节”而牺牲灵活性和轻松的工作。如果发生了需要处理大量数据的情况,那么您将能够对数据模型进行重构。当你知道你想问什么问题的时候。
JPAEntityManager
有merge()
和persist()
方法。在冬眠中还有更多-save
, persist
, saveOrUpdate
更新,合并。我一直在用merge()
为了简单起见,但我们必须知道这种方法的确切行为。
为了获得以下结果,我不得不阅读JPA规范(1.0,但我想它在2.0中应该保持不变):
https://movie.douban.com/doulist/145585807/
- 如果实体已经处于持久性上下文(会话)中,则除了级联之外,不采取任何行动。
- 如果实体被分离,则返回一个副本(对象‘),该副本被附加(托管)
- 如果实体是临时的(新实例),则保存该实体,并返回持久(和托管)副本。
- 如果实体被分离,但是当前实体管理器中存在具有相同标识符的对象,则将分离对象的状态复制到当前持久性实体中,并返回它(当前)。
下面是一个描述正在发生的事情的测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Message msg = new Message();
msg.setText( "Foo" );
Message msg2 = em.merge(msg);
System.out.println( "New, transient object: " + msg);
System.out.println( "Merged object: " + msg2);
Message msg3 = em.merge(msg2);
System.out.println( "Merging persistent object: " + msg3);
Message msg4 = new Message();
msg4.setText( "Bar" );
msg4.setId(msg3.getId());
Message msg5 = em.merge(msg4);
System.out.println( "Detached entity with same id: " + msg5);
System.out.println( "Merged text: " + msg5.getText());
em.clear();
Message msg6 = em.merge(msg5);
System.out.println( "Merged detached entity: " + msg6);
|
结果是:
https://www.itangyuan.com/book/catalogue/16337053.html
1 2 3 4 5 6 7 |
New, transient object: com.foo.model.Message@1f
Merged object: com.foo.model.Message@8da6fe83
Merging persistent object: com.foo.model.Message@8da6fe83
Detached entity with same id: com.foo.model.Message@8da6fe83
Merged text: Bar
Hibernate: select message0_.id as id1_1_, message0_.authorId .....
Merged detached entity: com.foo.model.Message@a13fade8
|
我在使用merge()
只是,但一个人必须知道他得到了什么。
(注:Hibernate的情况也是如此merge()
)