elasticsearch @IndexedEmbedded和@ContainedIn关系不起作用,elasticsearch,lucene,hibernate-search,elasticsearch,Lucene,Hibernate Search" /> elasticsearch @IndexedEmbedded和@ContainedIn关系不起作用,elasticsearch,lucene,hibernate-search,elasticsearch,Lucene,Hibernate Search" />

elasticsearch @IndexedEmbedded和@ContainedIn关系不起作用

elasticsearch @IndexedEmbedded和@ContainedIn关系不起作用,elasticsearch,lucene,hibernate-search,elasticsearch,Lucene,Hibernate Search,当使用@IndexedEmbedded和@ContainedIn关系时,来自一个索引“A”的数据应更新为另一个索引“B”。但包含@IndexedEmbedded注释的实体仍然没有使用包含@ContainedIn注释的实体中的数据进行更新 不确定,我做错了什么。但根据文件,这应该是可行的。一旦我更新了A,同样的情况也会反映在B上 弹性DB结构,我相信很好。但是索引是空的 但是当我手动将对象保存到弹性数据库时,HibernateMasterSearchIndex会更新 fullTextSession

当使用@IndexedEmbedded和@ContainedIn关系时,来自一个索引“A”的数据应更新为另一个索引“B”。但包含@IndexedEmbedded注释的实体仍然没有使用包含@ContainedIn注释的实体中的数据进行更新

不确定,我做错了什么。但根据文件,这应该是可行的。一旦我更新了A,同样的情况也会反映在B上

弹性DB结构,我相信很好。但是索引是空的

但是当我手动将对象保存到弹性数据库时,HibernateMasterSearchIndex会更新

fullTextSession.save(localBasclt0900TO.getHibernateMasterSearch());
我必须始终像上面那样保留/删除/更新数据。如果是的话,那么为什么hibernate搜索的文档会说它会自动工作呢

我认为这不是正确的做法

不管怎样,下面是代码 两个实体是:

HibernateMasterSearch(即将更新)

Basclt0900TO(将提供数据)

Basclt0100TO(将提供数据)

为HibernateMasterSearch休眠HBM

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name="com.csc.pt.svc.data.to.HibernateMasterSearch" table="HibernateMasterSearch">
         <id name="id" type="bphx.c2ab.hibernate.NullSafeLong" column="ID">
            <generator class="identity" />
         </id>
        </class>

  </hibernate-mapping>
除了上面的代码,我没有在代码中的任何地方使用fulltextsearch会话

hibernate.cfg.xml

<property name="hibernate.search.default.indexmanager">elasticsearch</property>
        <property name="hibernate.search.default.elasticsearch.host">http://127.0.0.1:9200</property>
        <property name="hibernate.search.default.elasticsearch.index_schema_management_strategy">drop-and-create</property>
        <property name="hibernate.search.default.elasticsearch.required_index_status">yellow</property>
将B/Basclt0900和C/Basclt0300持久化到数据库的方法相同


我是否应该同时将这些数据保存到ES DB。不确定如何处理/持久化数据,使复合索引能够随着对复合索引中涉及的DB表/索引所做的更改而更新。

不确定将HBM映射与注释映射混合使用是否是一个好主意,您可能只想切换到注释,只是检查一下,混合这两种方法没有任何问题。您还应该检查日志中是否有警告或错误,并检查实体是否在数据库中得到了更新(如果不是,这不是Hibernate搜索问题,而是Hibernate ORM问题)。请向我们展示您为修改实体而执行的代码,以及用于创建实体管理器和打开/提交事务的代码(如果Spring或某个JEE容器为您这样做,请提及)。感谢您的回复,对于您的查询:1)我在初始索引创建和向DB添加新记录方面没有收到任何错误。此外,新记录已成功添加到DB和相应的索引(例如Basclt0100),但在HibernateMasterSearchIndex下不会进行更新。2) 我没有显式/手动更新索引,我相信它是由Hibernate搜索ORM内部处理的。在我的问题中添加了配置代码。请提供用于更新实体的代码。问题很可能就在那里,例如,如果你没有像这样更新协会的双方。谢谢@YoannRodière,我在原始问题下附上代码。此外,我正在使用hibernate会话将数据持久化到DB,您是否建议在将数据持久化到DB时,我应该创建一个fulltextsesstion会话并将相同的数据持久化到ES DB。此外,我的对象通过不同的DAO方法持久化,并在流中使用,比如首先持久化a,然后持久化B,然后持久化C。因此,在持久化之前,我必须使用相同的对象添加到父对象。简言之,这三个都是按顺序保存的,我应该如何处理它。@YoannRodière,请看能否提供您的视图。
 @OneToOne(mappedBy = "basclt0900TO")
    @ContainedIn
    private HibernateMasterSearch hibernateMasterSearch;    


    public HibernateMasterSearch getHibernateMasterSearch() {
        return hibernateMasterSearch;
    }
    public void setHibernateMasterSearch(HibernateMasterSearch hibernateMasterSearch) {
     this.hibernateMasterSearch = hibernateMasterSearch;
    }
@OneToOne
@ContainedIn
private HibernateMasterSearch hibernateMasterSearch;    


public HibernateMasterSearch getHibernateMasterSearch() {
    return hibernateMasterSearch;
}
public void setHibernateMasterSearch(HibernateMasterSearch hibernateMasterSearch) {
    if(hibernateMasterSearch != null) {
        hibernateMasterSearch.setBasclt0100TO(this);
    }
    this.hibernateMasterSearch = hibernateMasterSearch;
}
    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
   <class name="com.csc.pt.svc.data.to.HibernateMasterSearch" table="HibernateMasterSearch">
         <id name="id" type="bphx.c2ab.hibernate.NullSafeLong" column="ID">
            <generator class="identity" />
         </id>
        </class>

  </hibernate-mapping>
private void createInitialIndex() {
        Session session = HibernateSessionFactory.current().getSession("");
        FullTextSession fullTextSession = Search.getFullTextSession(session.getSession());
        try {

            fullTextSession.createIndexer().startAndWait();

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
<property name="hibernate.search.default.indexmanager">elasticsearch</property>
        <property name="hibernate.search.default.elasticsearch.host">http://127.0.0.1:9200</property>
        <property name="hibernate.search.default.elasticsearch.index_schema_management_strategy">drop-and-create</property>
        <property name="hibernate.search.default.elasticsearch.required_index_status">yellow</property>
public static DBAccessStatus insert(Basclt0100TO basclt0100TO) {
    DBAccessStatus status = new DBAccessStatus();
    try {
        Session session = HibernateSessionFactory.current().getSession("BASCLT0100");
        if (Util.get(session, basclt0100TO, basclt0100TO.getId()) != null) {
            status.setSqlCode(DBAccessStatus.DB_DUPLICATE);
        } else {
            if (session.contains(basclt0100TO)) {
                session.evict(basclt0100TO);
            }
            LocalDateTime currentDate = LocalDateTime.now();
            Soundex soundex = new Soundex();    
            basclt0100TO.setPhnclient(soundex.encode(basclt0100TO.getClientname()));
            basclt0100TO.setPhnfirst(soundex.encode(basclt0100TO.getFirstname()));

            session.save(basclt0100TO);
            session.flush();
        }
    } catch (HibernateException ex) {
        status.setException(ex);
    }
    return status;
}