2012-03-15 3 views
1

EntityLoad с 1 аргументом должен возвращать все записи в таблице.EntityLoad ColdFusion отсутствует последняя запись

Однако, если я вызываю его сразу после EntityNew и EntitySave (который вставляет новую запись), последняя запись, по-видимому, отсутствует в результатах.

Я получаю запись обратно в порядке, если вместо этого передаю фильтр или я вызываю EntityLoadByPk. Я понимаю, что, возможно, вы не захотите получить запись, только что вставленную в тот же запрос, но мне все равно хотелось бы знать, что здесь происходит.

local.e = EntityNew("e"); 
local.e.setDescription("lorem ipsum"); 
EntitySave(local.e); 
local.id = local.e.getId(); 

//fails to get record inserted above 
dump(EntityLoad("e")); 

//gets record inserted above successfully 
dump(EntityLoadByPk("e", local.id)); 
+0

Я настоятельно рекомендую просмотреть эти сообщения в блоге от Brian Котек - http://www.briankotek.com/blog/index.cfm/ObjectRelational-Mapping - относительно ORM сессий. У Марка Манделя также есть хорошие посты на эту тему. – Antony

ответ

1

Это связано с сеансами Hibernate и когда SQL для сохранения объекта фактически запускается. Я не эксперт, поэтому трудно объяснить «рабочий процесс».

Один из способов использования этой проблемы - обернуть сущностьSave() в транзакции.

transaction{ 
    EntitySave(local.e); 
} 
+0

А, это сработало. Начиная с чтения немного больше по умолчанию поведение должно сделать ORMFlush() в конце каждого запроса. Часть, которую я до сих пор не понимаю, объясняет, почему другие вызовы смогли забрать новую запись в том же запросе. – Jere

2

Hibernate не сохраняется какой-либо datauntil запрос заканчивается, так что вы не можете получить запись, которая была EntitySave() d в той же просьбой.

Вы можете запустить ORMFlush() после вашей сущностиSave() и перед вашей entityLoad().

local.e = EntityNew("e"); 
local.e.setDescription("lorem ipsum"); 
EntitySave(local.e); 
local.id = local.e.getId(); 

//persist any dirty records so they are loaded in the next EntityLoad() 
ORMFlush(); 

//fails to get record inserted above 
dump(EntityLoad("e")); 
Смежные вопросы