1

我在massindexer 操作期间遇到了问题。

我使用 JPA 2.0-cr-1、Hibernate search 4.2.0.Final 和 hibernate 4.1.9.Final 和 lucene 版本 3.6.2。我也使用弹簧框架。

自从我使用 Hibernate search 4.2.0.Final 代替 Hibernate search 3.3.0.Final 后,我似乎遇到了问题。

我索引实体 User.java :

@Entity
@Table(name = "user", uniqueConstraints = {
    @UniqueConstraint(columnNames = "email"),
    @UniqueConstraint(columnNames = "login") })
@Indexed
@FullTextFilterDefs({
@FullTextFilterDef(name = "userFilterGroup", impl = UserFilterGroupFactory.class   ,cache=FilterCacheModeType.NONE),
@FullTextFilterDef(name = "userFilterAccountType", impl = LuceneStrFilterFactory.class ,cache=FilterCacheModeType.NONE)})
public class User extends TemporalBehavior implements java.io.Serializable {

/**
 * 
 */
private static final long serialVersionUID = -626437341655804022L;


public static final String[] SEARCH_FIELDS = new String[]{"id","login","email","profile.lastname","profile.firstname"};

private Integer id;

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@NotNull
@Size(min=1, max=255)
//@Size(min=6, max=255) //L'ancienne plateforme permet des login min=1
private String login;

@NotNull
@Size(min=1, max=255)
//@Size(min=6, max=255) //L'ancienne plateforme permet des pass min=1
private String password;

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
@Email
private String email;

@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String partnerRef;

private Set<Contract> contracts = new HashSet<Contract>(0);
private Set<Contract> ownedContracts = new HashSet<Contract>();

    ....
    @ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.PERSIST)
@JoinTable(name = "user_contract", joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "contract_id", nullable = false, updatable = false) })
public Set<Contract> getContracts() {
    return this.contracts;
}

    @OneToMany(mappedBy="owner")
public Set<Contract> getOwnedContracts() {
    return this.ownedContracts;
}

    ...

    }

我调用的 Massindexer 操作:

FullTextEntityManager fem = Search.getFullTextEntityManager(em);
    try {
        fem.createIndexer(User.class)
        .purgeAllOnStart(true)
        .optimizeAfterPurge( true )   
        .optimizeOnFinish( true )
        .batchSizeToLoadObjects(100)  
        .threadsForSubsequentFetching(8)  
        .threadsToLoadObjects(4)  
        .cacheMode(CacheMode.NORMAL)    // todo : It is recommended to leave cacheMode to CacheMode.IGNORE (the default), as in most reindexing situations the cache will be a useless additional overhead; 
        .startAndWait();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

然后质量索引器完成它的工作,但有一些错误(不是所有用户数据):

[05-02-2013 13:06:11:086] ERROR org.hibernate.search.exception.impl.LogErrorHandler  -   HSEARCH000058: HSEARCH000116: Unexpected error during MassIndexer operation
org.hibernate.PersistentObjectException: detached entity passed to persist:   com.mycompany.prj.model.commercial.Contract
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
at org.hibernate.tuple.entity.AbstractEntityTuplizer$IncrediblySillyJpaMapsIdMappedIdentifierValueMarshaller.getIdentifier(AbstractEntityTuplizer.java:491)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:337)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4491)
at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:810)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:799)
at org.hibernate.internal.SessionImpl.access$1700(SessionImpl.java:175)
at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2361)
at org.hibernate.engine.spi.CascadingAction$2.cascade(CascadingAction.java:178)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:383)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:412)
at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:353)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:329)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
at org.hibernate.event.internal.DefaultLockEventListener.cascadeOnLock(DefaultLockEventListener.java:92)
at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:82)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:810)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:799)
at org.hibernate.internal.SessionImpl.access$1700(SessionImpl.java:175)
at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2361)
at org.hibernate.engine.spi.CascadingAction$2.cascade(CascadingAction.java:178)
at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:383)
at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:326)
at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
at org.hibernate.event.internal.DefaultLockEventListener.cascadeOnLock(DefaultLockEventListener.java:92)
at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:82)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:810)
at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:803)
at org.hibernate.internal.SessionImpl.access$1800(SessionImpl.java:175)
at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2364)
at org.hibernate.search.batchindexing.impl.EntityConsumerLuceneWorkProducer.indexAllQueue(EntityConsumerLuceneWorkProducer.java:133)
at org.hibernate.search.batchindexing.impl.EntityConsumerLuceneWorkProducer.run(EntityConsumerLuceneWorkProducer.java:104)
at org.hibernate.search.batchindexing.impl.OptionallyWrapInJTATransaction.run(OptionallyWrapInJTATransaction.java:132)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)

任何想法 ?

4

1 回答 1

1

当您尝试保留其 ID 已存在的实体时,似乎会发生这种情况。如果您打算让 MassIndexer 在给出的错误中更新合同记录,那么我相信您可能希望将 CascadeType 注释更改为:(CascadeType.ALL或者可能CascadeType.SAVE_UPDATE)。

看看这个问题,它进一步讨论了这个异常。

于 2013-02-05T18:01:37.190 回答