Spring + hibernateでアプリケーションを作成しましたが、いつもこのエラーが出ます。これは休止状態で私の最初のアプリケーションです、私はいくつかのガイドを読みますが、私はこの問題を解決することはできません。どこが悪いの?
これは私のアプリケーションのコードです
ott 05, 2014 4:03:06 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
Informazioni: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1eab16b: startup date [Sun Oct 05 16:03:06 CEST 2014]; root of context hierarchy
ott 05, 2014 4:03:06 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Informazioni: Loading XML bean definitions from class path resource [springConfig.xml]
ott 05, 2014 4:03:08 PM org.hibernate.annotations.common.reflection.Java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
ott 05, 2014 4:03:08 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.6.Final}
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
ott 05, 2014 4:03:09 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
ott 05, 2014 4:03:09 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService
INFO: HHH000399: Using default transaction strategy (direct JDBC transactions)
ott 05, 2014 4:03:09 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.Java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.Java:1014)
at coreservlets.StudentDAOImpl.create(StudentDAOImpl.Java:19)
at coreservlets.MainApp.main(MainApp.Java:14)
学生。ジャワ
package coreservlets;
public class Student {
private Integer id;
private String name;
private Integer age;
public Integer getId(){return id;}//getId
public void setId(Integer id){this.id=id;}//setId
public String getName(){return name;}//getName
public void setName(String name){this.name=name;}//setName
public Integer getAge(){return age;}//getAge
public void setAge(Integer age){this.age=age;}//setAge
}//Student
studentDAO.Java
package coreservlets;
import org.hibernate.SessionFactory;
public interface StudentDAO {
public void setSessionFactory(SessionFactory sessionFactory);
public void create(String name,Integer age);
}//StudentDAO
StudentDAOImpl.Java
package coreservlets;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class StudentDAOImpl implements StudentDAO {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory=sessionFactory;
}//setSessionFactory
public void create(String name,Integer age){
Session session=sessionFactory.getCurrentSession();
Student student=new Student();
student.setName(name);
student.setAge(age);
session.save(student);
}//create
}//StudentDAOImpl
MainApp.Java
package coreservlets;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml");
StudentDAOImpl student=(StudentDAOImpl) context.getBean("studentDAOImpl");
student.create("Alessandro", new Integer(33));
}//main
}//MainApp
springConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<context:annotation-config/>
<context:component-scan base-package="coreservlets"/>
<bean id="dataSource" class="org.Apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="initialSize" value="5"/>
<property name="maxTotal" value="10"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQLDialect
</value>
</property>
</bean>
</beans>
sQL
create table student
(
id integer not null auto_increment,
name varchar(20) not null,
age integer not null,
primary key(id)
);
トランザクションサポート(<tx:annotation-driven>
または@EnableTransactionManagement
)および宣言transactionManager
を有効にするにする必要があります。これはSessionFactory
を介して機能するはずです。
@Transactional
に@Repository
を追加する必要があります
@Transactional
に@Repository
を入れることでSpringはあなたのリポジトリにトランザクションサポートを適用することができます。
あなたのStudent
クラスには@ javax.persistence。*アノテーションがありません。どのように@Entity
、私はそのクラスのマッピング設定がXMLを通して定義されていると思います。
私は同じ問題を抱えていますが、それはサービス層の一部ではなかったクラスです。私の場合、トランザクションマネージャは単にgetBean()
メソッドによってコンテキストから取得され、そのクラスはビューレイヤに属していました - 私のプロジェクトはOpenSessionInView
テクニックを利用しています。
sessionFactory.getCurrentSession()
メソッドは、作者のものと同じ例外を引き起こしています。私にとっての解決策はかなり単純でした。
Session session;
try {
session = sessionFactory.getCurrentSession();
} catch (HibernateException e) {
session = sessionFactory.openSession();
}
getCurrentSession()
メソッドが失敗した場合、openSession()
がうまくいくはずです。
クラスサービスにspringのアノテーション@Transactionalを追加します。
あなたのxyz.DAOImpl.Javaに
以下の手順を実行してください。
// Step-1:セッションファクトリを設定する
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf)
{
this.sessionFactory = sf;
}
// Step-2:現在のセッションを取得し、HibernateException例外をキャッチします。
// Step-3:HibernateException例外がある場合は、trueにしてopenSessionを取得します。
try
{
//Step-2: Implementation
session = sessionFactory.getCurrentSession();
}
catch (HibernateException e)
{
//Step-3: Implementation
session = sessionFactory.openSession();
}
@Transactional = javax.transaction.Transactionalは@リポジトリの横に配置します。
私はweb.xmlにこれらの設定を追加しました、そしてそれは私のためにうまく働きます!
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
さらに、最もランクの高い回答は、最初の実行時にアプリケーションがパニックにならないようにするための手がかりを与えてくれます。
あなたはあなたのDAOメソッドへのトランザクションを許可する必要があります。追加、
@ Transactional(readOnly = true、伝播= Propagation.NOT_SUPPORTED)
あなたのDAOメソッドを超えて。そして@Transactionalはパッケージであるべきです、
org.springframework.transaction.annotation.Transactional
@Transactional
アノテーションを使用したファイルで、間違ったクラスをインポートしていたため、このエラーも発生しました
import javax.transaction.Transactional;
Javaxの代わりに、
import org.springframework.transaction.annotation.Transactional;
私の設定はこんな感じでした。私はQuartzJob、Service Bean、そしてDaoを持っていました。通常通り、LocalSessionFactoryBean(休止状態用)、およびQuartzフレームワーク用のSchedulerFactoryBeanで設定されていました。 Quartzの仕事を書いている間に、私は間違って@Serviceのアノテーションを付けましたが、QuartzBeanを配線するために別の方法を使っていたのでそうしてはいけません)AutowiringSpringBeanJobFactoryを拡張してSpringBeanJobFactoryを使用します。
そのため、実際に起こっていたのは、Quartz Autowireのおかげで、TXがJob Beanにインジェクトされ、同時にT(x)コンテキストが@Serviceアノテーションによって設定されたため同期していない!
私はそれが上記の解決策が本当に問題を解決しなかった人たちのために役立つことを願っています。私はSpring 4.2.5とHibernate 4.0.1を使っていました、
このスレッドでは、DAO(@Repository)に@Transactionalアノテーションを追加するという不要な提案があることがわかりました。 DAOはサービスから呼び出されるため、@リポジトリには、@トランザクション対応を特別に設定する必要はありません。 @ Trasancationalによって既に注入されています。これが、Quartz、Spring、およびHibernateを一緒に使用している人に役立つことを願っています。
私は同じ問題に遭遇し、最後にそれが[dispatcher] -servlet.xml内で定義されていないことを発見しました。ここでcomponent-scan要素は@serviceアノテーション付きクラスを有効にしました。
単にcomponent-scan要素を組み合わせるだけで、問題は解決しました。
spring-servlet.xml:でtransaction-manager
に<annotation-driven/>
を追加してください
<tx:annotation-driven transaction-manager="yourTransactionBeanID"/>
私の解決策は、(Springを使用して)トランザクションを作成してコミットする別のメソッド内に失敗したメソッドを入れることでした。
それをするために、私は最初に以下を注入しました:
@Autowired
private PlatformTransactionManager transactionManager;
そして最後にこれをやった:
public void newMethod() {
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus transaction = transactionManager.getTransaction(definition);
oldMethod();
transactionManager.commit(transaction);
}
私の同じような問題は以下の2つのアプローチで修正されました。
トランザクションを手動で処理することによって。
セッションsession = sessionFactory.getCurrentSession();
トランザクションtx = session.beginTransaction();
UserInfo user =(UserInfo)session.get(UserInfo.class、1);
tx.commit();
Web.xmlフィルタであなたに代わってトランザクションを開いて管理するようにSpringに指示し、@ Repository @Transactionalを必ず使用してください。
<フィルタ> <フィルタ名> hibernateFilter </フィルタ名> <フィルタクラス> org.springframework.orm.hibernate5.support.OpenSessionInViewFilter </フィルタクラス> <init-param> <パラメータ名> sessionFactory <パラメータ-value> session.factory </ init-param> </ filter> <フィルタマッピング> <フィルタ名> hibernateFilter </フィルタ名> <url-pattern>/* </ url-pattern> </ filter-マッピング>
不適切なフォーマットでごめんね。
あなたのdaoクラスをチェックしてください。これは次のようになります。
Session session = getCurrentSession();
Query query = session.createQuery(GET_ALL);
そして注釈:
@Transactional
@Repository