Ошибка StackOverflow при использовании ORM внутри транзакции

Если я помещаю какие-либо операции ORM в транзакцию, я получаю сообщение об ошибке.

Настройка: CentOS 6, MySQL 5.6 и Lucee 4.5.1.

Код

<!--- stuff here is fine --->
<cftransaction>
    <cfscript>
        qryInsert = EntityNew("Game");
    <cfscript>
</cftransaction>

or

<cfscript>
//stuff here is fine...
transaction{
    qryInsert = EntityNew("Game");
}
</cfscript>

Сущности

Лига.cfc

component persistent="true" table="Leagues"{
    property name="leagueID" ormtype="int" fieldtype="id" generator="identity";
    property name="User" fieldtype="many-to-one" cfc="User" fkcolumn="userID";
    property name="LeagueTournamentType" fieldtype="many-to-one" cfc="LeagueTournamentType" fkcolumn="leagueTournamentTypeID";
    property name="leagueName" ormtype="string";
    property name="leagueAbbr" ormtype="string";
    property name="teamName" ormtype="string";
    property name="gameInMinutes" ormtype="int";
    property name="deleteYN" ormtype="boolean";
    property name="showReportYN ormtype="boolean";
}

Сезон.cfc

component persistent="true" table="Seasons"{
    property name="seasonID" ormtype="int" fieldtype="id" generator="identity";
    property name="User" fieldtype="many-to-one" cfc="User" fkcolumn="userID";
    property name="name" ormtype="string";
    property name="deleteYN" ormtype="boolean";
    property name="showReportYN" ormtype="boolean";
}

Пользователь.cfc

component persistent="true" table="Users"{
    property name="userID" ormtype="int" fieldtype="id" generator="identity";
    property name="username" ormtype="string";
    property name="pwd" ormtype="string";
    property name="email" ormtype="string";
    property name="Language" fieldtype="many-to-one" cfc="Language" fkcolumn="langID";
    property name="createdDate" ormtype="timestamp";
    property name="lastLoginDate" ormtype="timestamp";
    property name="activatedYN" ormtype="boolean";
}

Ошибка в вопросе:

Lucee 4.5.1.022 Error (java.lang.StackOverflowError)
Message     java.lang.StackOverflowError
Cause   java.lang.StackOverflowError
Java Stacktrace     java.lang.StackOverflowError
    at java.util.HashMap$HashIterator.(HashMap.java:1411):1411
    at java.util.HashMap$ValueIterator.(HashMap.java:1456):1456
    at java.util.HashMap$Values.iterator(HashMap.java:959):959
    at java.util.AbstractCollection.toArray(AbstractCollection.java:180):180
    at lucee.runtime.orm.hibernate.SessionFactoryData.getDataSources(SessionFactoryData.java:314):314
    at lucee.runtime.orm.hibernate.HibernateORMSession.getDataSources(HibernateORMSession.java:850):850
    at lucee.runtime.db.DatasourceManagerImpl.add(DatasourceManagerImpl.java:111):111
    at lucee.runtime.PageContextImpl.getORMSession(PageContextImpl.java:3138):3138
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:59):59
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:55):55
    at lucee.runtime.orm.hibernate.tuplizer.accessors.CFCGetter.get(CFCGetter.java:71):71
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230):230
    at lucee.runtime.orm.hibernate.tuplizer.AbstractEntityTuplizerImpl.getIdentifier(AbstractEntityTuplizerImpl.java:66):66
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852):3852
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:80):80
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190):190
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147):147
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219):219
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99):99
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206
    at lucee.runtime.orm.hibernate.HibernateORMTransaction.begin(HibernateORMTransaction.java:40):40
    at lucee.runtime.orm.ORMConnection.(ORMConnection.java:61):61
    at lucee.runtime.orm.ORMDatasourceConnection.(ORMDatasourceConnection.java:52):52
    at lucee.runtime.db.DatasourceManagerImpl._add(DatasourceManagerImpl.java:122):122
    at lucee.runtime.db.DatasourceManagerImpl.add(DatasourceManagerImpl.java:113):113
    at lucee.runtime.PageContextImpl.getORMSession(PageContextImpl.java:3138):3138
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:59):59
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:55):55
    at lucee.runtime.orm.hibernate.tuplizer.accessors.CFCGetter.get(CFCGetter.java:71):71
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230):230
    at lucee.runtime.orm.hibernate.tuplizer.AbstractEntityTuplizerImpl.getIdentifier(AbstractEntityTuplizerImpl.java:66):66
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852):3852
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:80):80
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190):190
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147):147
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219):219
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99):99
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206
    at lucee.runtime.orm.hibernate.HibernateORMTransaction.begin(HibernateORMTransaction.java:40):40
    at lucee.runtime.orm.ORMConnection.(ORMConnection.java:61):61
    at lucee.runtime.orm.ORMDatasourceConnection.(ORMDatasourceConnection.java:52):52
    at lucee.runtime.db.DatasourceManagerImpl._add(DatasourceManagerImpl.java:122):122

Несколько обновлений позже...

Lucee 4.5.1.022 Error (java.lang.StackOverflowError)
Message     java.lang.StackOverflowError
Cause   java.lang.StackOverflowError
Java Stacktrace     java.lang.StackOverflowError
    at org.hibernate.util.IdentityMap.entries(IdentityMap.java:93):93
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareCollectionFlushes(AbstractFlushingEventListener.java:179):179
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:92):92
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206
    at lucee.runtime.orm.hibernate.HibernateORMTransaction.begin(HibernateORMTransaction.java:40):40
    at lucee.runtime.orm.ORMConnection.(ORMConnection.java:61):61
    at lucee.runtime.orm.ORMDatasourceConnection.(ORMDatasourceConnection.java:52):52
    at lucee.runtime.db.DatasourceManagerImpl._add(DatasourceManagerImpl.java:122):122
    at lucee.runtime.db.DatasourceManagerImpl.add(DatasourceManagerImpl.java:113):113
    at lucee.runtime.PageContextImpl.getORMSession(PageContextImpl.java:3138):3138
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:59):59
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:55):55
    at lucee.runtime.orm.hibernate.tuplizer.accessors.CFCGetter.get(CFCGetter.java:71):71
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230):230
    at lucee.runtime.orm.hibernate.tuplizer.AbstractEntityTuplizerImpl.getIdentifier(AbstractEntityTuplizerImpl.java:66):66
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852):3852
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:80):80
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190):190
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147):147
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219):219
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99):99
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206
    at lucee.runtime.orm.hibernate.HibernateORMTransaction.begin(HibernateORMTransaction.java:40):40
    at lucee.runtime.orm.ORMConnection.(ORMConnection.java:61):61
    at lucee.runtime.orm.ORMDatasourceConnection.(ORMDatasourceConnection.java:52):52
    at lucee.runtime.db.DatasourceManagerImpl._add(DatasourceManagerImpl.java:122):122
    at lucee.runtime.db.DatasourceManagerImpl.add(DatasourceManagerImpl.java:113):113
    at lucee.runtime.PageContextImpl.getORMSession(PageContextImpl.java:3138):3138
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:59):59
    at lucee.runtime.orm.ORMUtil.getSession(ORMUtil.java:55):55
    at lucee.runtime.orm.hibernate.tuplizer.accessors.CFCGetter.get(CFCGetter.java:71):71
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230):230
    at lucee.runtime.orm.hibernate.tuplizer.AbstractEntityTuplizerImpl.getIdentifier(AbstractEntityTuplizerImpl.java:66):66
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852):3852
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:80):80
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190):190
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147):147
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219):219
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99):99
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206

Обновление №1

Использование любого кода ORM или попытка загрузки любого объекта приведет к этой ошибке.

У меня есть сущность для Game, мне не удалось вставить соответствующий код.

Я изменил сущность и получаю те же ошибки:

transaction{
    qryInsert = EntityNew("Game");
}

Однако на этот раз возникла новая ошибка, прежде чем обновиться и попасть в те же трассировки стека, которые были указаны ранее.

Lucee 4.5.1.022 Error (java.lang.StackOverflowError)
Message     java.lang.StackOverflowError
Cause   java.lang.StackOverflowError
Java Stacktrace     java.lang.StackOverflowError
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3852):3852
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:80):80
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190):190
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147):147
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219):219
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99):99
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50):50
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206):1206
    at lucee.runtime.orm.hibernate.HibernateORMTransaction.begin(HibernateORMTransaction.java:40):40
    at lucee.runtime.orm.ORMConnection.(ORMConnection.java:61):61
    at lucee.runtime.orm.ORMDatasourceConnection.(ORMDatasourceConnection.java:52):52

Обновление №2

Настройки ОРМ:

<cfset THIS.ormEnabled = true>
<cfset THIS.datasource = "abc">
<cfset THIS.ormSettings = {logsql = true, cfclocation="entity", dbCreate = "none", dialect = "MySQLwithInnoDB"}>
<cfset THIS.invokeImplicitAccessor = true>

Обновление №3

Решение, добавив autoManageSession в мои настройки ORM:

<cfset THIS.ormSettings = {logsql = true, cfclocation="entity", dbCreate = "none", dialect = "MySQLwithInnoDB", autoManageSession = false}>

person TekiusFanatikus    schedule 22.11.2015    source источник
comment
Каковы ваши настройки в Application.cfc?   -  person CfSimplicity    schedule 23.11.2015
comment
@cfsimplicity см. обновление №2 с настройками orm из application.cfc...   -  person TekiusFanatikus    schedule 23.11.2015
comment
Вы также можете проверить базу данных ошибок Lucee на предмет ошибок такого типа. Не уверен, что это актуально, но очень быстрый поиск дал похожая проблема №233 для 4.5.1   -  person Leigh    schedule 23.11.2015


Ответы (2)


Я подозреваю, что ошибка может быть связана с этой известной проблемой: чтобы обойти ее, попробуйте добавить autoManageSession=false в свои настройки.

person CfSimplicity    schedule 23.11.2015
comment
@cfsimplicity В моей транзакции у меня есть entitySave(), фиксация транзакции, а затем ormflush()... после этого объект отсутствует в моей БД - person TekiusFanatikus; 24.11.2015

В приведенных вами примерах вы пытаетесь загрузить объект «Игра», который вы не определили (или, по крайней мере, не включили). Я подозреваю, что трассировки стека, которые вы получаете, исходят из попытки сбросить слишком много данных.

Что произойдет, если вы попробуете что-то вроде:

<cfscript>
transaction{
        qryInsert = EntityNew("Season");
        qryInsert.setName('testing');
        EntitySave(qryInsert);
}
</cfscript>
person Chip Pinkston    schedule 23.11.2015
comment
Плохо, не вставил соответствующий объект. У меня есть объект Game. См. обновление № 1, в котором показано использование объекта, указанного в моем сообщении. Все, что связано с ORM в транзакции, и оно терпит неудачу (даже простой ORMExecuteQuery терпит неудачу). Должно быть, я сделал что-то действительно неправильное, чтобы поверить в это, потому что невозможность использовать ORM в транзакции — это странно. - person TekiusFanatikus; 23.11.2015