我需要对存储在面向文档的数据库(MongoDB)中的(简单)Java对象图进行版本控制.对于关系数据库和Hibernate,我发现了Envers并且对这些可能性感到非常惊讶.是否有类似的东西可以用于Spring Data Documents?
我发现这篇文章概述了我对存储对象版本的想法(以及更多......),我当前的实现类似,因为它将对象的副本存储在带有时间戳的单独历史记录集合中,但我想改进这一点以节省存储空间.因此,我认为我需要在对象树上实现"diff"操作,并且需要"merge"操作来重建旧对象.有没有图书馆帮助这个?
编辑:任何MongoDB和版本的体验高度赞赏!我看到很可能没有Spring Data解决方案.
Spring Data和MongoDB的第一次实验非常棒.现在我有了以下结构(简化):
public class Letter {
@Id
private String id;
private List<Section> sections;
}
public class Section {
private String id;
private String content;
}
Run Code Online (Sandbox Code Playgroud)
加载和保存整个Letter对象/文档就像一个魅力.(我使用ObjectId为Section.id字段生成唯一的ID.)
Letter letter1 = mongoTemplate.findById(id, Letter.class)
mongoTemplate.insert(letter2);
mongoTemplate.save(letter3);
Run Code Online (Sandbox Code Playgroud)
由于文档很大(200K),有时应用程序只需要子部分:是否有可能查询子文档(部分),修改并保存它?我想实现一个类似的方法
Section s = findLetterSection(letterId, sectionId);
s.setText("blubb");
replaceLetterSection(letterId, sectionId, s);
Run Code Online (Sandbox Code Playgroud)
当然还有以下方法:
addLetterSection(letterId, s); // add after last section
insertLetterSection(letterId, sectionId, s); // insert before given section
deleteLetterSection(letterId, sectionId); // delete given section
Run Code Online (Sandbox Code Playgroud)
我看到最后三种方法有点"奇怪",即加载整个文档,修改集合并再次保存它可能是从面向对象的角度来看更好的方法; 但第一个用例("导航"到子文档/子对象并在此对象的范围内工作)似乎很自然.
我认为MongoDB可以更新子文档,但SpringData可以用于对象映射吗?谢谢你的任何指示.
我将hibernate.jdbc.batch_size参数增加到50.这使我们的应用程序中的批处理更快,这很好.我是否需要预期应用程序的"常规"任务有任何缺点?应用程序响应Web请求,并为每个请求使用单个数据库连接.大多数请求只从数据库中读取,一些请求保存了一些对象(但不是数百个).
非常感谢您分享您的经验.
我正在尝试将 SPNEGO/Kerberos5 身份验证与 Active Directory 2008 和 Java 一起使用。我遵循了本指南:http : //spnego.sourceforge.net/ - “预检”进展顺利,但后来我得到了著名的例外:
Exception in thread "main" GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:856)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:906)
at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:556)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at de.meona.auth.spnego.TestSpnegoAes.main(TestSpnegoAes.java:45)
Caused by: KrbException: Checksum failed
at sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType.decrypt(Aes256CtsHmacSha1EType.java:102)
Run Code Online (Sandbox Code Playgroud)
我仔细查看了这篇文章,因为问题似乎很相似: 校验和失败:Kerberos / Spring / Active Directory (2008)
为了使问题可重现,我编写了一个小的 Java 类。我能够单步到发生异常的那一行。我认为这是因为用于解密的秘密服务密钥与 Active Directory 用于加密服务票证的秘密服务密钥不同。怎么会这样?
public class TestSpnegoAes {
private static Oid spnegoOid = null;
private static String negotiate = …Run Code Online (Sandbox Code Playgroud) 我使用Apache CXF发布Web服务,"即时"生成WSDL.这很好用,但我想更改生成类型的命名约定.当服务客户端(C#)基于WSDL生成代码时,默认的xsd:complexType命名会导致以小写字母开头的类型名称.
以下是生成的WSDL的摘录:
<xs:complexType name="protocolItem">
<xs:sequence>
<xs:element minOccurs="0" name="data" type="tns:protocolItemData"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="elements" nillable="true" type="tns:protocolElement"/>
<xs:element minOccurs="0" name="meta" type="tns:protocolItemMeta"/>
</xs:sequence>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
这是导致上述WSDL片段的Java代码:
@RooJavaBean
public class ProtocolItem {
private ProtocolItemData data;
private ProtocolItemMeta meta;
private List<ProtocolElement> elements;
}
Run Code Online (Sandbox Code Playgroud)
如何更改生成的WSDL以使用类似的东西<xs:complexType name="ProtocolItem">?
希望我没有错过明显的注释......谢谢!
编辑:谢谢你的第一个答案!所以有一种方法可以"按类"执行此操作 - 我可以配置CXF命名约定吗?如果我不需要注释所有类,那将会很好.
我想知道MongoDB内存消耗.我已经阅读了相应的手册部分和有关该主题的其他问题,但我认为这种情况有所不同.我可以问你的意见吗?
这是DB日志文件中的错误:
Fri Oct 26 20:34:00 [conn1] ERROR: mmap private failed with out of memory. (64 bit build)
Fri Oct 26 20:34:00 [conn1] Assertion: 13636:file /docdata/mongodb/data/xxx_letters.5 open/create failed in createPrivateMap (look in log for more information)
Run Code Online (Sandbox Code Playgroud)
这些是数据文件:
total 4.0G
drwxr-xr-x 2 mongodb mongodb 4.0K 2012-10-26 20:21 journal
-rw------- 1 mongodb mongodb 64M 2012-10-25 19:34 xxx_letters.0
-rw------- 1 mongodb mongodb 128M 2012-10-20 22:10 xxx_letters.1
-rw------- 1 mongodb mongodb 256M 2012-10-24 09:10 xxx_letters.2
-rw------- 1 mongodb mongodb 512M 2012-10-26 10:04 xxx_letters.3
-rw------- …Run Code Online (Sandbox Code Playgroud) 我使用Spring Roo和Vaadin作为(简单)数据库应用程序.有一个视图显示包含实体的表.对于要显示的表,Hibernate需要延迟加载1:n引用的实体.这适用于小型表,但只要表变大,只有第一部分正确显示,并发生以下异常.
com.vaadin.data.util.MethodProperty$MethodException
at com.vaadin.data.util.MethodProperty.getValue(MethodProperty.java:612)
at com.vaadin.data.util.AbstractProperty.toString(AbstractProperty.java:78)
at com.vaadin.ui.Table.formatPropertyValue(Table.java:3476)
at eu.wuttke.tinyscrum.ui.dashboard.DashboardTaskStoryTable.formatPropertyValue(DashboardTaskStoryTable.java:66)
at com.vaadin.ui.Table.getPropertyValue(Table.java:3428)
at com.vaadin.ui.Table.getVisibleCellsNoCache(Table.java:1853)
at com.vaadin.ui.Table.refreshRenderedCells(Table.java:1477)
at com.vaadin.ui.Table.enableContentRefreshing(Table.java:2645)
at com.vaadin.ui.Table.changeVariables(Table.java:2491)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1455)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1399)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1318)
at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:763)
at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:296)
at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor841.invoke(Unknown Source)
at …Run Code Online (Sandbox Code Playgroud)