NHibernate 프로젝트에서 작업 중이며 이전에 컬렉션을로드하는 데 문제가있는 곳 (http://stackoverflow.com/questions/4213506/c-hibernate-criteria-loading- 컬렉션), 이제는 데이터 사용에 문제가 있습니다.C# 데이터를 사용할 때 Spring LazyInitializationException이있는 NHibernate
나는 NHibernate와 Spring.Net 프레임 워크와 함께 C#을 사용하고 있는데, 예를 들어 'ordercredit'을로드 한 다음 ordercredit의 객체에 액세스하면 LazyInitializationException이 발생합니다.
[Transaction(TransactionPropagation.Required, ReadOnly = true)]
public OrderCredit GetOrderCredit(long ordercreditid)
{
var creditrules = Session.CreateCriteria(typeof(OrderCredit));
creditrules.Add(Restrictions.Eq("Id", ordercreditid));
return creditrules.List<OrderCredit>()[0];
}
내 로컬 컴퓨터에서이 작업을 실행
모든 :OrderCredit oc = CreditService.getOrderCredit(ordercredit.Id);
I로드에 사용하는 코드는 DAO 구현을 사용하여 수행됩니다 :
은 내가 OrderCredit을 얻기 위해이 코드를 사용 잘 작동하고, 실제로 그 'ordercredits'의 목록을로드하기위한 것이 었습니다. 그러나 그것은 잘못되었습니다. 그래서 더 간단한 단계를 먼저 시도했습니다.
'OrderCredit'내의 개체는 [OneToMany]로 정의됩니다.
NHibernate.LazyInitializationException : 초기화 [.OrderObject는 # 5496522] 초기화 안되나요 나는 TESTSERVER에 넣어로드 된 OrderCredit의 'OrderObject'개체에 액세스하려고 할 때
, 나는 오류 proxy - 세션 없음. 실패
코드 :
Log.Debug(oc.OrderObject.Name);
코드 작동 :
Log.Debug(oc.Id);
이것은 OrderCredit의 일부 개체에 대한 발생,하지만 난 OrderCredit의 속성 필드에 액세스 할 수 있어요 (예를 들어 OrderCredit.Id).
또한 메서드를 호출하는 원래 함수에 데이터를 반환하기 전에 개체에 액세스하면 정보에 액세스 할 수 있으므로 캐시에 액세스 할 수 있습니다.
나는이 문제에 관해 많은 것을 읽었지만, Lazy를 끄는 것처럼, 그러나 그것은 나에게도 (또는 나는 잘못된 곳에서) 그렇게하지 못했다.
나를 가장 좌절시키는 것은 테스트 서버가 아닌 내 로컬 컴퓨터에서 실제로 작동한다는 것입니다. 나는 무엇을 잘못 할 수 있 었는가?
도움이 매우 감사합니다.
1 업데이트 :
I로드 1 ordercredit의 기본 방법을 사용하여, 지금 GenericDao를 사용하고 있습니다. 다음 코드를 사용하여 Id로 1 ordercredit을로드합니다.
OrderCredit oc = GenericService.Load<OrderCredit>(Id);
나는 ordercredit에 부착 된 개체에 액세스 할 수 있어요 의미 GenericDAO이 다음은,하지만이 종료되지 않거나 세션을 나누기 내부의 코드 :
[Transaction(TransactionPropagation.Supports, ReadOnly = true)]
public T Load<T>(long id) where T : ISaveableObject
{
var obj = Session.Load<T>(id);
return obj;
}
이것은이다 이 질문의 앞 부분에 포함 된 기능과 거의 같은 코드입니다.
저는 세션이 끝날 수있는 것이 무엇인지 모르기 때문에 지금 혼란 스럽습니다. 나중에 작동 할 것이지만 나중에 변경하고 싶습니다. 그래서 함수를 사용하여 전체 컬렉션을 호출하고 for each 루프를 통해 액세스 할 수 있습니다.
현재 'getOrderCredits'함수를 사용하여 OrderCredit 객체의 목록을 가져오고 foreach에서는 Id를 얻고 GenericDao.Load를 사용하여 실제 항목을 가져오고 객체 등을 액세스 할 수 있습니다. . 물론 이것은 이것이 있어야하고 필요로하는 방식이 아닙니다.
이 문제가 해결되면 놀랄 것입니다.
NH 세션을 열고 닫으시겠습니까? 이 오류 메시지는 시도한 지연로드가 발생할 때까지 NH 세션이 닫혔다 고 제안합니다. –
그것은 내가 일하는 프로젝트의 확장판입니다. 트랜잭션은 Hibernate/Spring 트랜잭션 관리자에 의해 다루어진다. 나는 여러 가지 일을 시도해 왔으며, 작은 일을하려고왔다. 내 질문을 편집하고이 정보와 코드를 추가합니다. 내 상황에서 그것이 잘못된 것만 알지는 못합니다. – Honnes