Java HibernateeException:将实体保存到数据库时,未找到当前线程的会话
我正试图找出问题所在,但我无能为力 我只想使用Hibernate SessionFactory将实体保存到数据库中,但没有发现异常会话 Hibernate版本:4.1.9.Final Spring版本:3.2.4.0版本 这里是web.xmlJava HibernateeException:将实体保存到数据库时,未找到当前线程的会话,java,spring,hibernate,Java,Spring,Hibernate,我正试图找出问题所在,但我无能为力 我只想使用Hibernate SessionFactory将实体保存到数据库中,但没有发现异常会话 Hibernate版本:4.1.9.Final Spring版本:3.2.4.0版本 这里是web.xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:annotation-driven />
<!-- <mvc:resources mapping="/resources/**" location="/resources/" cache-period="3600" /> -->
<context:annotation-config />
<context:component-scan base-package="com.example" /> <!-- controller -->
<!-- Load Hibernate related configuration -->
<import resource="hibernate-context2.xml" />
<context:property-placeholder location="/WEB-INF/db.properties" />
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="${hibernate.config}"
p:packagesToScan="com.example.model"/>
<!-- Declare a datasource that has pooling capabilities-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="${app.jdbc.driverClassName}"
p:jdbcUrl="${app.jdbc.url}"
p:user="${app.jdbc.username}"
p:password="${app.jdbc.password}"
p:acquireIncrement="5"
p:idleConnectionTestPeriod="60"
p:maxPoolSize="100"
p:maxStatements="50"
p:minPoolSize="10" />
<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory" />
<hibernate-configuration>
<session-factory>
<!-- We're using MySQL database so the dialect needs to MySQL as well-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- Enable this to see the SQL statements in the logs-->
<property name="show_sql">true</property>
<!-- This will drop our existing database and re-create a new one.
Existing data will be deleted! -->
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
存储库类
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc:mysql://localhost/equation
app.jdbc.username=root
app.jdbc.password=12345
#hibernate properties
hibernate.config=/WEB-INF/hibernate.cfg.xml
@Repository
public class EquationRepository implements EquationDAO {
private SessionFactory sessionFactory;
@Autowired
public EquationRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@Override
public void addEquation(Equation equation) {
currentSession().save(equation);
}
@Service
public class EquationServiceImpl implements EquationService {
private EquationRepository repository;
@Autowired
public void setRepository(EquationRepository repository) {
this.repository = repository;
}
@Override
public void equationCulc(EquationDto dto) {
Equation equation = DTOTransfer(dto);
double a = dto.getA();
double b = dto.getB();
double c = dto.getC();
double D = (b*b) - 4 * a * c;
if(D == 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
} else if(D > 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
equation.setX2((-b - Math.sqrt(D)) / (2 * a));
}
repository.addEquation(equation);
}
@Controller()
public class HomeController {
@Autowired
private EquationService equationService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHome(Model model) {
model.addAttribute("equation", new EquationDto());
return "index";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String equationForm(@ModelAttribute("equation") EquationDto equationDto) {
equationService.equationCulc(equationDto);
return "redirect:/examples";
}
}
服务等级
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc:mysql://localhost/equation
app.jdbc.username=root
app.jdbc.password=12345
#hibernate properties
hibernate.config=/WEB-INF/hibernate.cfg.xml
@Repository
public class EquationRepository implements EquationDAO {
private SessionFactory sessionFactory;
@Autowired
public EquationRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@Override
public void addEquation(Equation equation) {
currentSession().save(equation);
}
@Service
public class EquationServiceImpl implements EquationService {
private EquationRepository repository;
@Autowired
public void setRepository(EquationRepository repository) {
this.repository = repository;
}
@Override
public void equationCulc(EquationDto dto) {
Equation equation = DTOTransfer(dto);
double a = dto.getA();
double b = dto.getB();
double c = dto.getC();
double D = (b*b) - 4 * a * c;
if(D == 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
} else if(D > 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
equation.setX2((-b - Math.sqrt(D)) / (2 * a));
}
repository.addEquation(equation);
}
@Controller()
public class HomeController {
@Autowired
private EquationService equationService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHome(Model model) {
model.addAttribute("equation", new EquationDto());
return "index";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String equationForm(@ModelAttribute("equation") EquationDto equationDto) {
equationService.equationCulc(equationDto);
return "redirect:/examples";
}
}
控制器类
# database properties
app.jdbc.driverClassName=com.mysql.jdbc.Driver
app.jdbc.url=jdbc:mysql://localhost/equation
app.jdbc.username=root
app.jdbc.password=12345
#hibernate properties
hibernate.config=/WEB-INF/hibernate.cfg.xml
@Repository
public class EquationRepository implements EquationDAO {
private SessionFactory sessionFactory;
@Autowired
public EquationRepository(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@Override
public void addEquation(Equation equation) {
currentSession().save(equation);
}
@Service
public class EquationServiceImpl implements EquationService {
private EquationRepository repository;
@Autowired
public void setRepository(EquationRepository repository) {
this.repository = repository;
}
@Override
public void equationCulc(EquationDto dto) {
Equation equation = DTOTransfer(dto);
double a = dto.getA();
double b = dto.getB();
double c = dto.getC();
double D = (b*b) - 4 * a * c;
if(D == 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
} else if(D > 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
equation.setX2((-b - Math.sqrt(D)) / (2 * a));
}
repository.addEquation(equation);
}
@Controller()
public class HomeController {
@Autowired
private EquationService equationService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHome(Model model) {
model.addAttribute("equation", new EquationDto());
return "index";
}
@RequestMapping(value = "/", method = RequestMethod.POST)
public String equationForm(@ModelAttribute("equation") EquationDto equationDto) {
equationService.equationCulc(equationDto);
return "redirect:/examples";
}
}
我对这东西不熟悉。尤其是使用这个旧版本和xml配置。请原谅我这个愚蠢的名字:)
如果我忘了什么,请告诉我您正在尝试使用sessionFactory.getCurrentSession()获取现有会话。我认为不存在会话,因为您没有用@Transactional注释任何调用代码
尝试在EquationRepository类的addEquation()方法上添加@Transactional注释。将@Transactional注释添加到服务层有帮助
@Service
public class EquationServiceImpl implements EquationService {
private EquationRepository repository;
@Autowired
public void setRepository(EquationRepository repository) {
this.repository = repository;
}
@Override
@Transactional
public void equationCulc(EquationDto dto) {
Equation equation = DTOTransfer(dto);
double a = dto.getA();
double b = dto.getB();
double c = dto.getC();
double D = (b * b) - 4 * a * c;
if (D == 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
} else if (D > 0) {
equation.setX1((-b + Math.sqrt(D)) / (2 * a));
equation.setX2((-b - Math.sqrt(D)) / (2 * a));
}
repository.addEquation(equation);
}