Этот блог может помочь вам. Хитрость заключается в том, чтобы использовать SpEL (язык выражения весны) для чтения системных свойств, таких как user.home
, для чтения домашнего каталога пользователя с использованием SpEL, вы можете использовать выражение #{ systemProperties['user.home']}
внутри элементов вашего компонента. Например, чтобы получить доступ к вашему файлу свойств, хранящемуся в вашем домашнем каталоге, вы можете использовать следующее в вашем PropertyPlaceholderConfigurer, у меня это сработало.
file:#{ systemProperties['user.home']}/ur_folder/settings.properties
Насколько мне известно, cascade = "all-delete-orphan"
принадлежит элементу сопоставления коллекции, а не многие-к-одному
. Вы не показали две другие части вашего отображения, поэтому я не могу сказать наверняка, но это возможная (вероятная) проблема.
Я думаю Человек
должен выглядеть примерно так:
<!-- other properties -->
<set name="Events" inverse="true" cascade="all-delete-orphan">
<key column="Person_id" />
<one-to-many class="PersonEventRegistration" />
</set>
Событие
:
<!-- similar mapping for Event -->
PersonEventRegistration
:
<!-- other properties -->
<many-to-one name="Person" class="Person" column="PersonId" foreign-key="FK_PersonEvent_PersonId" cascade="delete" <!-- or many ="all" ? --> />
На самом деле вышеупомянутые каскады могут быть конфликтующими (что может быть у вас). На самом деле, мой ответ состоит в двух вещах:
cascade = "all-delete-orphan"
не имеет значения для многие-к-одному
. Попробуйте отменить ссылки на Person и Event в delete:
public bool UnregisterFromEvent(Person person, Event entry)
{
var registrationEntry = this.session
.CreateCriteria<PersonEventRegistration>()
.Add(Restrictions.Eq("Person", person))
.Add(Restrictions.Eq("Event", entry))
.Add(Restrictions.Eq("IsComplete", false))
.UniqueResult<PersonEventRegistration>();
bool result = false;
if (null != registrationEntry)
{
using (ITransaction tx = this.session.BeginTransaction())
{
registrationEntry.Person = null;
registrationEntry.Event = null;
this.session.Delete(registrationEntry);
tx.Commit();
result = true;
}
}
return result;
}
Также, я не знал, что можно добавить ограничение на объект, я бы написал это, используя псевдонимы и ID.
.Add(Restrictions.Eq("Person", person))
.Add(Restrictions.Eq("Event", entry))