只读模式下不允许执行Spring Write操作

时间:2014-12-07 20:57:27

标签: java spring hibernate intellij-idea

我知道关于这个问题已经存在很多问题,但是大多数问题都涉及XML配置,我使用了注释。我的IDE是IntelliJ,我使用Gradle作为我的构建系统。

所以我有一个非常简单的Web服务,我想启用登录和注册功能。我的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.)的警告。任何人都知道为什么会这样吗?

P.S。如果有人在我的findByUsername方法中被Lambda表达式吓到了,我就是在使用Java 8。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,我将@Transactional(readOnly = false)注释添加到addUser方法,@Primary添加到hibTransMan类中的AppConfig方法。但是,关于@Autowired的警告仍然存在,有人知道为什么吗?