Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试和控制器中标记为事务的方法的不同行为_Java_Spring_Hibernate_Transactions - Fatal编程技术网

Java 测试和控制器中标记为事务的方法的不同行为

Java 测试和控制器中标记为事务的方法的不同行为,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我已将类候选服务标记为@Transactional @Transactional @Service("candidateService") public class CandidateService { @Autowired private CandidateDao candidateDao; .... public void add(Candidate candidate) { Authentication auth = SecurityC

我已将类候选服务标记为@Transactional

@Transactional
@Service("candidateService")
public class CandidateService {

    @Autowired
    private CandidateDao candidateDao;

    ....

    public void add(Candidate candidate) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String login = auth.getName();
        User user =  utilService.getOrSaveUser(login);
        candidate.setAuthor(user);
        candidateDao.add(candidate);
    }
   ...
}
dao实现:

@Override
    public Integer add(Candidate candidate) throws HibernateException{
        Session session = sessionFactory.getCurrentSession();
        if (candidate == null) {
            return null;
        }
        Integer id = (Integer) session.save(candidate);
        return id;

    }
如果我在@controller类中写入:

@RequestMapping("/submitFormAdd")
    public ModelAndView submitFormAdd(
            Model model,
            @ModelAttribute("myCandidate") @Valid Candidate myCandidate,
            BindingResult result,
            RedirectAttributes redirectAttributes) {
        if (result.hasErrors()) {
            return new ModelAndView("candidateDetailsAdd");
        }

        myCandidate.setDate(new Date());
        candidateService.add(myCandidate);

    .....
    }
执行此方法后,将数据放入数据库

如果我编写测试:

@ContextConfiguration(locations = {"classpath:/test/BeanConfig.xml"})
public class CandidateServiceTest extends AbstractTransactionalJUnit4SpringContextTests{

    @Autowired
    CandidateService candidateService;

    @BeforeClass
    public static void initialize() throws Exception{

        UtilMethods.createTestDb();

    }
    @Before
    public void setup() {
        TestingAuthenticationToken testToken = new TestingAuthenticationToken("testUser", "");
        SecurityContextHolder.getContext().setAuthentication(testToken);
    }

    @After
    public void cleanUp() {
        SecurityContextHolder.clearContext();
    }
    @Test
    public void add(){
        Candidate candidate = new Candidate();
        candidate.setName("testUser");
        candidate.setPhone("88888");
        candidateService.add(candidate);
        List<Candidate> candidates = candidateService.findByName(candidate.getName());
        Assert.assertNotNull(candidates);
        Assert.assertEquals("88888", candidates.get(0).getPhone());
    }
}
@ContextConfiguration(位置={“classpath:/test/BeanConfig.xml})
公共类候选服务测试扩展了AbstractTransactionalJUnit4SpringContextTests{
@自动连线
候选服务候选服务;
@课前
公共静态void initialize()引发异常{
UtilMethods.createTestDb();
}
@以前
公共作废设置(){
TestingAuthenticationToken testToken=新的TestingAuthenticationToken(“testUser”,下称“);
SecurityContextHolder.getContext().setAuthentication(testToken);
}
@之后
公共空间清理(){
SecurityContextHolder.clearContext();
}
@试验
公共无效添加(){
候选者=新候选者();
candidate.setName(“testUser”);
候选者。setPhone(“88888”);
候选服务。添加(候选);
List candidates=candidateService.findByName(candidate.getName());
Assert.assertNotNull(候选项);
Assert.assertEquals(“88888”,candidates.get(0.getPhone());
}
}
测试是绿色的,但执行后我在数据库中看不到数据

你能解释一下为什么以及如何修理它吗

更新

configuration:
<tx:annotation-driven transaction-manager="transactionManager" />

    <!-- Менеджер транзакций -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
配置:

我认为您应该添加带有param defaultRollback=false的TransactionConfiguration注释

测试方法完成后,更改将回滚。测试方法数据库更改被还原,您可以使用新数据执行其他测试。 您无需担心不同测试用例中具有相同id的模型对象

如果需要公共数据,可以在setup()方法中使用,该方法的更改也不会保存在数据库中

在执行测试方法之前,将调用setup()方法。如果您有3个测试方法,那么将调用3次setup()方法

对不起,我的英语不好

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
上面的测试类不会影响到数据库


设置或添加
defaultRollback=false
以查看表中持久化的数据。

是否使用@Rollback注释标记方法?