我正面临着我认为Hibernate的一个简单问题,但无法解决它(Hibernate论坛无法访问肯定没有帮助).
我有一个简单的课程,我想坚持,但继续得到:
SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
[ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
[ a bunch more ]
Run Code Online (Sandbox Code Playgroud)
持久化类的相关代码是:
package hibtest.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem {
protected Long id;
protected Mensagem() { }
@Id
@GeneratedValue
public Long getId() {
return id;
} …Run Code Online (Sandbox Code Playgroud) 我已使用ContextLoaderListener和上下文init-parameter 配置了根应用程序上下文contextConfigLocation.
然后由JSF(*.jsf)变量解析器访问根上下文.它工作正常.
现在的问题是,通过的请求(*.do)DispatcherServlet将获得另一个应用程序上下文,然后单例bean被实例化两次.
我不需要另一个应用程序上下文DispatcherServlet,我如何指定它来重用现有的根应用程序上下文ContextLoaderListener?
注意
在阅读了答案中的参考页面后,我知道根上下文和调度程序上下文之间存在上下文分离,但没有一个引用告诉我去哪里.所以这是我的解决方案,可能对面临类似问题的其他人有帮助:
在调度程序servlet的上下文配置XML中:dispatcher-servlet.xml,我<context:component-scan/>已经定义了重复,这已经在根上下文中定义.所以删除它.该dispatcher-servlet.xml只需要定义仅用于Spring MVC的那些豆子.
所有控制器都已在根上下文中进行扫描和实例化,但是,默认情况下,Spring MVC不会在根上下文中注册控制器以进行请求映射.你可以:
2.1.在根上下文中,@Controller从dispatcher-servlet.xml中排除<component-scan>,@Controller仅扫描.
2.2.或者,将属性设置DefaultAnnotationHandlerMapping.detectHandlersInAncestorContexts为true:
(dispatcher-servlet.xml:)
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="detectHandlersInAncestorContexts" value="true" />
</bean>
Run Code Online (Sandbox Code Playgroud)我在Spring MVC 3.1项目中使用基于注释的事务,并且在抛出异常时我的事务没有被回滚.
这是我的服务代码
@Service
public class ImportService {
@Autowired
ImportMapper importMapper;
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class)
public void processImport() throws ServiceException, DatabaseException {
iImport import = new Import();
createImport(import);
throw new ServiceException("");
}
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class)
private void createImport(Import import) throws DatabaseException {
try {
importMapper.createImport(eventImport);
} catch (Exception e) {
throw new DatabaseException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,希望在抛出异常后回滚createImport方法.但不幸的是,事实并非如此.
我在服务器context.xml中定义我的数据源
<Resource name="datasource.import" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@INFO" />
Run Code Online (Sandbox Code Playgroud)
我正在寻找JNDI:
<jee:jndi-lookup id="dataSource" jndi-name="datasource.import"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" /> …Run Code Online (Sandbox Code Playgroud) 我写了这个简单的例子:
//file TestController.java
public interface TestController {
public List<Test> findAll();
}
//file TestControllerImp.java
@Controller
public class TestControllerImp implements TestController{
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory=sessionFactory;
}
public List<Test> findAll() {
return sessionFactory.getCurrentSession().createQuery("from Test").list();
}
}
//file TestService.java
@Service
public class TestService {
@Autowired
private TestController controller;
public boolean flag=true;
public void setController(TestController controller){
this.controller=controller;
}
@Transactional
public List<Test> useController(){
flag=false;
return controller.findAll();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试:
TestService s1=context.getBean(TestService.class);
TestService s2=context.getBean(TestService.class);
List<Test> list=s1.useController();
System.out.println(s1.flag+" "+s2.flag);
Run Code Online (Sandbox Code Playgroud)
现在奇怪的行为(即时通讯非常新的春天):
@Transactional …