【发布时间】:2014-12-07 20:57:26
【问题描述】:
我知道已经有很多关于 SO 的问题了,但其中大多数是指 XML 配置,我正在使用注释。我的 IDE 是 IntelliJ,我使用 Gradle 作为构建系统。
所以我有一个非常简单的网络服务,我想启用登录和注册功能。我的 DAO 如下所示:
public class UserDAO implements IUserDAO {
@Autowired
private HibernateTemplate hibernateTemplate;
@Override
public void addUser(User user) {
hibernateTemplate.save(user);
}
@Override
public User findByUsername(String username) {
return hibernateTemplate.execute(session -> (User)
session.createCriteria(User.class)
.add(Restrictions.eq("username", username))
.uniqueResult());
}
}
我的配置是这样的:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public IUserDAO userDAO() {
return new UserDAO();
}
@Bean
public HibernateTemplate hibernateTemplate() {
return new HibernateTemplate(sessionFactory());
}
@Bean
public SessionFactory sessionFactory() {
return new LocalSessionFactoryBuilder(getDataSource())
.addAnnotatedClasses(User.class)
.buildSessionFactory();
}
@Bean
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://example.com:3306/myDatabase");
dataSource.setUsername("myUser");
dataSource.setPassword("myUser123");
return dataSource;
}
@Bean
public HibernateTransactionManager hibTransMan() {
return new HibernateTransactionManager(sessionFactory());
}
}
我在 RestController 中使用它来获取 DAO:
@Autowired
private IUserDAO userDAO;
执行findByUsername 工作正常并返回与给定用户名匹配的User。但是,addUser 方法不起作用,并给我这个错误:
Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
我环顾四周,发现我应该将@Transactional(readOnly = false) 添加到我的函数中,所以我这样做了(我将它添加到我的addUser 函数上方,如果那是放置它的正确位置...),但后来我得到了这个错误:
No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: hibTransMan,transactionManager
任何人都可以帮助我解决这种情况吗?此外,对于任何 IntelliJ 用户,我的 UserDAO 中的 @Autowired 注释会被标记为带有 Autowired members must be defined in the valid spring bean(@Component/@Service,etc.) 的警告。有人知道为什么会这样吗?
附:如果有人对我的findByUsername 方法中的 Lambda 表达式感到震惊,我使用的是 Java 8。
【问题讨论】:
标签: java spring hibernate intellij-idea