遅延読み込み用に Spring/Hibernate の OpenSessionInView パターンを実装しました。「No Sessoon」または「2 つ以上のセッション」の問題に直面しています。手順が不足している場合はお知らせください。
詳細コードの一部を次に示します。
Web.XML
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>flushModeName</param-name>
<param-value>FLUSH_AUTO</param-value>
</init-param>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
applicationContext.xml
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan"
value="com.mypack.common.model, com.mypack.school.model" />
.
.
<!-- Other properties -->
.
</bean>
顧客.xhtml
XHTML ユーザー インターフェイスには、顧客コードを示すオートコンプリート ボックスがあります。オートコンプリート クエリは CompleteCustomer メソッドを使用しますが、getCustomerbyCode はコンバーター Bean によって呼び出されます。
顧客コードを選択すると、選択した顧客の詳細が画面に表示されます。アプリケーション ユーザーは、DB に変更を加えて更新を保存することができます。
CustomerBean.java
@ManagedBean (name="customerBean")
@ViewScoped
public class CustomerBean implements Serializable {
public List<Customer> completeCustomer(String query) {
List<Customer> suggestions;
suggestions = (List<Customer>) customerService.getCustomerslikeCodeOrName(query, authenticationBean.getTenantId());
return suggestions;
}
public void saveCustomerDetails() {
// Save or Update User Information in Database
customerService.saveCustomer(custMaster);
return;
}
CustomerServiceImpl.java
@Service("customerService")
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public class CustomerServiceImpl implements CustomerService {
@Autowired
CustomerDAO custMasterDAO;
@Override
@Transactional(readOnly = false,propagation = Propagation.REQUIRED)
public void saveCustomer(Customer custDetails) {
custMasterDAO.saveCustomer(custDetails);
}
@Override
public Customer getCustomerbyCode(String custCode, TenantId tenantId) {
return custMasterDAO.getCustomerbyCode(custCode, tenantId);
}
@Override
public List<Customer> getCustomerslikeCodeOrName(String custIDName, TenantId tenantId) {
return custMasterDAO.getCustomerslikeCodeOrName(custIDName, tenantId);
}
}
CustomerMasterDAO.java
@SuppressWarnings("unchecked")
@Override
public List<Customer> getCustomerslikeCodeOrName(String custIDName, TenantId tenantId) {
List<Customer> listCustomers = null;
custIDName = "%" + custIDName + "%";
Session session = SessionFactoryUtils.getSession(sessionFactory, false);
Transaction tx = session.beginTransaction();
try {
query = session.createQuery("from Customer " +
"where (custId like :codename " +
"or custFirstName like :codename " +
"or custMiddleName like :codename " +
"or custLastName like :codename)")
.setParameter("codename", custIDName);
listCustomers = query.list();
} catch(Exception ex) {
tx.rollback();
System.out.println("*** getCustomerslikeCodeOrName ***" + ex.getMessage());
}
return listCustomers;
}
@SuppressWarnings("unchecked")
@Override
public Customer getCustomerbyCode(String custCode, TenantId tenantId) {
List<Customer> list = null ;
Query query;
Session session = SessionFactoryUtils.getSession(sessionFactory, Boolean.FALSE);
Transaction tx = session.beginTransaction();
Filter sessionFilter = session.enableFilter("BankRecordFilter");
sessionFilter.setParameter("bankCode", tenantId.getBankCode());
try {
query = session.createQuery("from Customer where custId = :custCode");
list = query.setParameter("custCode", custCode).list();
} catch (Exception ex) {
tx.rollback();
System.out.println("*** getCustomerbyCode ***" + ex.getMessage());
}
if (list == null || list.size() < 1){
// System.out.println("No Records Found");
return null;
}
return (Customer)list.get(0);
}
@Override
public void saveCustomer(Customer custDetails) {
Session session = getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
try {
session.saveOrUpdate("bkCustomer", custDetails);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
}
}
テーブル定義は .hbm.xml ファイルに保存されます。
セッションを取得するために、次のステートメントを配置する多くの組み合わせを試しました: session = getSessionFactory().getCurrentSession(); セッション セッション = SessionFactoryUtils.getSession(sessionFactory, Boolean.FALSE);
また、異なる方法および異なる場所での取引。No Session のエラー メッセージが表示されるか、2 つ以上のセッションが接続されているというエラー メッセージが表示されます。
私のコードの何が問題なのか教えてください。
よろしく、
シリッシュ