我正在寻找显示如何将MongoDB与Hibernate集成的资源(最好是从春季开始),以便我可以在RDBMS和NoSql替代方案之间切换:有没有人有这方面的经验?
我目前正在考虑将使用Spring,GWT,Hibernate,Jackrabbit,Hibernate Search/Lucene(以及其他)的单租户基于Java的Web应用程序转换为完全成熟的SaaS风格应用程序.
我偶然发现了一篇文章,其中强调了以下7个"事物"作为对单个租户应用程序进行重要更改以使其成为SaaS应用程序:
我的问题是,是否有人使用与我列出的类似技术在SaaS /多租户应用程序中实现上述任何7项内容?在我走上正在考虑的道路之前,我希望得到关于最佳方法的尽可能多的意见.
作为一个开始,我很确定我能够很好地处理如何在模型级别处理多个租户.我正在考虑为所有表添加租户ID,然后使用Hibernate过滤器(以及Hibernate Search的全文过滤器)根据登录用户的所有查询的租户ID进行过滤.
然而,我对性能也有一些担忧,特别是当我们的租户数量增长很多时.
任何有关如何实施此解决方案的建议都将受到高度赞赏(如果这个问题有点过于开放,我会道歉).
我在一个带有spring boot 1.4.0.RELEASE的应用程序中使用hibernate.
索引的实体看起来像是:
@Entity(name = "SearchableTariffItem")
@Indexed
public class SearchableTariffItem {
public static final String ZIFFER_ANALYZER_NAME = "ZIFFER_ANALYZER";
@GeneratedValue(strategy = GenerationType.TABLE)
@Id
private Long id;
...
}
Run Code Online (Sandbox Code Playgroud)
我第一次保存实体时现在收到以下警告:
2016-08-26 15:08:32.501 WARN 8476 — [apr-8080-exec-6] org.hibernate.orm.deprecation : HHH90000015: Found use of deprecated [org.hibernate.id.MultipleHiLoPerTableGenerator] table-based id generator; use org.hibernate.id.enhanced.TableGenerator instead. See Hibernate Domain Model Mapping Guide for details.
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道在哪里可以配置我的应用程序(最好是在application.yml中)来使用TableGenerator该类.
我使用以下依赖项:
我收到此错误:
java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
Run Code Online (Sandbox Code Playgroud)
这些是我的类路径中的jar:
com.sun.faces/jsf-api/jars/jsf-api-2.0.0.jar
com.sun.faces/jsf-impl/jars/jsf-impl-2.0.0.jar
org.apache.myfaces.orchestra/myfaces-orchestra-core20/jars/myfaces-orchestra-core20-1.5-SNAPSHOT.jar
commons-lang/commons-lang/jars/commons-lang-2.1.jar
commons-logging/commons-logging/jars/commons-logging-1.1.1.jar
org.springframework/spring/jars/spring-2.5.6.jar
commons-el/commons-el/jars/commons-el-1.0.jar
org.richfaces.ui/richfaces-ui/jars/richfaces-ui-3.3.3.Final.jar
org.richfaces.framework/richfaces-api/jars/richfaces-api-3.3.3.Final.jar
commons-collections/commons-collections/jars/commons-collections-3.2.jar
commons-beanutils/commons-beanutils/jars/commons-beanutils-1.8.0.jar
org.richfaces.framework/richfaces-impl-jsf2/jars/richfaces-impl-jsf2-3.3.3.Final.jar
com.sun.facelets/jsf-facelets/jars/jsf-facelets-1.1.14.jar
org.hibernate/hibernate-core/jars/hibernate-core-3.6.0.Final.jar
antlr/antlr/jars/antlr-2.7.6.jar
dom4j/dom4j/jars/dom4j-1.6.1.jar
org.hibernate/hibernate-commons-annotations/jars/hibernate-commons-annotations-3.2.0.Final.jar
org.slf4j/slf4j-api/jars/slf4j-api-1.6.1.jar
org.hibernate.javax.persistence/hibernate-jpa-2.0-api/jars/hibernate-jpa-2.0-api-1.0.0.Final.jar
javax.transaction/jta/jars/jta-1.1.jar
org.hibernate/hibernate-c3p0/jars/hibernate-c3p0-3.6.0.Final.jar
c3p0/c3p0/jars/c3p0-0.9.1.jar
org.hibernate/hibernate-entitymanager/jars/hibernate-entitymanager-3.6.0.Final.jar
cglib/cglib/jars/cglib-2.2.jar
asm/asm/jars/asm-3.1.jar
javassist/javassist/jars/javassist-3.12.0.GA.jar
org.hibernate/hibernate-search/jars/hibernate-search-3.3.0.Final.jar
org.hibernate/hibernate-search-analyzers/jars/hibernate-search-analyzers-3.3.0.Final.jar
org.apache.lucene/lucene-core/jars/lucene-core-3.0.3.jar
org.apache.lucene/lucene-analyzers/jars/lucene-analyzers-3.0.3.jar
mysql/mysql-connector-java/jars/mysql-connector-java-5.1.13.jar
com.ocpsoft/prettyfaces-jsf2/jars/prettyfaces-jsf2-3.0.1.jar
commons-digester/commons-digester/jars/commons-digester-2.0.jar
org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.6.1.jar
log4j/log4j/bundles/log4j-1.2.16.jar
xom/xom/jars/xom-1.2.5.jar
xml-apis/xml-apis/jars/xml-apis-1.3.03.jar
xerces/xercesImpl/jars/xercesImpl-2.8.0.jar
xalan/xalan/jars/xalan-2.7.0.jar
org.jboss.jsfunit/jboss-jsfunit-core/jars/jboss-jsfunit-core-1.3.0.Final.jar
net.sourceforge.htmlunit/htmlunit/jars/htmlunit-2.8.jar
xalan/xalan/jars/xalan-2.7.1.jar
xalan/serializer/jars/serializer-2.7.1.jar
xml-apis/xml-apis/jars/xml-apis-1.3.04.jar
commons-collections/commons-collections/jars/commons-collections-3.2.1.jar
commons-lang/commons-lang/jars/commons-lang-2.4.jar
org.apache.httpcomponents/httpclient/jars/httpclient-4.0.1.jar
org.apache.httpcomponents/httpcore/jars/httpcore-4.0.1.jar
commons-codec/commons-codec/jars/commons-codec-1.4.jar
org.apache.httpcomponents/httpmime/jars/httpmime-4.0.1.jar
org.apache.james/apache-mime4j/jars/apache-mime4j-0.6.jar
net.sourceforge.htmlunit/htmlunit-core-js/jars/htmlunit-core-js-2.8.jar
xerces/xercesImpl/jars/xercesImpl-2.9.1.jar
net.sourceforge.nekohtml/nekohtml/jars/nekohtml-1.9.14.jar
net.sourceforge.cssparser/cssparser/jars/cssparser-0.9.5.jar
org.w3c.css/sac/jars/sac-1.3.jar
commons-io/commons-io/jars/commons-io-1.4.jar
cactus/cactus/jars/cactus-13-1.7.1.jar
cactus/cactus-ant/jars/cactus-ant-13-1.7.1.jar
commons-httpclient/commons-httpclient/jars/commons-httpclient-2.0.2.jar
junit/junit/jars/junit-3.8.1.jar
aspectj/aspectjrt/jars/aspectjrt-1.2.1.jar
cargo/cargo/jars/cargo-0.5.jar
ant/ant/jars/ant-1.5.4.jar
Run Code Online (Sandbox Code Playgroud)
这是我的ivy.xml:
<dependencies>
<!-- JSF 2.0 RI -->
<dependency org="com.sun.faces" name="jsf-api" rev="2.0.0"/>
<dependency …Run Code Online (Sandbox Code Playgroud) 我有一个查询,它在表的大约11个字符串或文本字段上进行ILIKE,这个字段不大(500 000),但对于ILIKE显然太大,搜索查询需要20秒.数据库是postgres 8.4
我需要实现这个搜索更快.
我想到了什么:
我从需要搜索的所有列中组装了另外的TVECTOR列,并在其上创建了全文索引.全文搜索非常快.但是......我无法在我的.hbms中映射这个TVECTOR类型.所以这个想法下降了(无论如何我更多地将它作为临时解决方案).
Hibernate搜索.(今天第一次听到它)它看起来很有希望,但我需要经验丰富的意见,因为我不想进入新的API,可能不是最简单的,因为可以做得更简单.
Lucene的
在任何情况下,这个表现在已经发生了,但我希望解决方案更通用,并应用于与全文搜索相关的未来案例.
所有建议都表示赞赏!
感谢名单
我在部署耳朵时收到此错误.
org.jboss.msc.service.StartException in service jboss.persistenceunit."test.ear/server.war#graphdb": java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.ogm.service.impl.OgmIntegrator not a subtype
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:172)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117)
at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: java.util.ServiceConfigurationError: org.hibernate.integrator.spi.Integrator: Provider org.hibernate.ogm.service.impl.OgmIntegrator not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.loadJavaServices(ClassLoaderServiceImpl.java:324)
at org.hibernate.integrator.internal.IntegratorServiceImpl.<init>(IntegratorServiceImpl.java:40)
at org.hibernate.boot.registry.BootstrapServiceRegistryBuilder.build(BootstrapServiceRegistryBuilder.java:213)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.buildBootstrapServiceRegistry(EntityManagerFactoryBuilderImpl.java:288)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:161)
at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:160)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135)
at org.hibernate.ogm.jpa.HibernateOgmPersistence.createContainerEntityManagerFactory(HibernateOgmPersistence.java:96)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:318)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$1100(PersistenceUnitServiceImpl.java:67)
at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:167)
... 7 more
Run Code Online (Sandbox Code Playgroud)
我的持久性xml是
<persistence-unit name="graphdb" transaction-type="JTA"> …Run Code Online (Sandbox Code Playgroud) 我正在研究针对我们的数据库提供更好搜索功能的机制.它目前是一个巨大的瓶颈(导致长期查询损害了我们的数据库性能).
我的老板想让我看看Solr,但经过仔细观察,似乎我们真的想要一些与Lucene本身的数据库集成机制.
从Lucene FAQ中,他们推荐使用Hibernate Search,Compass和DBSight.
作为我们当前技术堆栈的背景,我们在Tomcat上使用直接JSP,没有Hibernate,在其上没有其他框架......只针对DB2数据库直接使用Java,JSP和JDBC.
鉴于此,似乎Hibernate Search可能更难以集成到我们的系统中,尽管在这样的集成之后可以选择使用Hibernate.
有没有人可以使用其中一种工具(或其他类似的基于Lucene的解决方案)分享可能有助于选择合适工具的经验?
它需要是一个FOSS解决方案,理想情况下将自动更新来自数据库的更新Lucene(尽管有效),而无需额外的努力在更改时通知工具(否则,似乎滚动我自己的Lucene解决方案将只是一样好).此外,我们有多个应用程序服务器只有一个数据库(+故障转移),因此如果能够轻松地无缝地使用所有应用程序服务器的解决方案,那就太好了.
我现在继续检查选项,但是利用其他人的经验会非常有帮助.
我有一个执行基于给定的输入标题字段搜索的搜索框,让用户建议先从文字是基于Lucene和Hibernate Search的inserted.It所有可用的标题.它一直工作,直到输入空间.然后结果消失了.例如,我希望"学习H"给我"学习Hibernate"作为结果.但是,这不会发生.你能告诉我我应该在这里使用什么呢?
查询生成器:
QueryBuilder qBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(LearningGoal.class).get();
Query query = qBuilder.keyword().wildcard().onField("title")
.matching(searchString + "*").createQuery();
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(query, BooleanClause.Occur.MUST);
for (LearningGoal exGoal : existingGoals) {
Term omittedTerm = new Term("id", String.valueOf(exGoal.getId()));
bQuery.add(new TermQuery(omittedTerm), BooleanClause.Occur.MUST_NOT);
}
@SuppressWarnings("unused")
org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(
query, LearningGoal.class);
Run Code Online (Sandbox Code Playgroud)
Hibernate类:
@AnalyzerDef(name = "searchtokenanalyzer",tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = StandardFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = StopFilterFactory.class,params = {
@Parameter(name = "ignoreCase", value = "true") }) })
@Analyzer(definition = "searchtokenanalyzer")
public …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方法可以在运行时获取类的注释信息?因为我想获得sepcifily注释的属性.
例:
class TestMain {
@Field(
store = Store.NO)
private String name;
private String password;
@Field(
store = Store.YES)
private int age;
//..........getter and setter
}
Run Code Online (Sandbox Code Playgroud)
注释来自hibernate-search,现在我想要的是将"TestMain"的哪个属性注释为"字段"(在示例中,它们是[name,age]),并且"存储"( store = store.yes)'(在示例中,它们是[ age ])在运行时.
有任何想法吗?
更新:
public class FieldUtil {
public static List<String> getAllFieldsByClass(Class<?> clazz) {
Field[] fields = clazz.getDeclaredFields();
ArrayList<String> fieldList = new ArrayList<String>();
ArrayList<String> storedList=new ArrayList<String>();
String tmp;
for (int i = 0; i < fields.length; i++) {
Field fi = fields[i];
tmp = fi.getName();
if …Run Code Online (Sandbox Code Playgroud) æ、ø、å 是挪威语字母表中的最新字母
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Æ Ø Å
Run Code Online (Sandbox Code Playgroud)
当我们尝试使用 Hibernate Lucene 对其进行排序时 Å clubs with A,Ø clubs with Ø, ,Æ clibs with A这是错误的。例如:
当前结果:
阿鲁、阿鲁、巴鲁、扎鲁、
预期成绩:
阿鲁、巴鲁、扎鲁、阿鲁、
以下是工作代码:
@AnalyzerDef(name = "myOwnAnalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = ASCIIFoldingFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = PatternReplaceFilterFactory.class, params = {
@Parameter(name …Run Code Online (Sandbox Code Playgroud) java ×7
hibernate ×6
lucene ×4
spring ×2
annotations ×1
database ×1
integration ×1
ivy ×1
jpa ×1
maven ×1
mongodb ×1
multi-tenant ×1
neo4j ×1
runtime ×1
saas ×1
spring-boot ×1
wildfly ×1