2012-02-02 222 views
0

我是Spring和JPA的新手,遇到标题中指定的问题。为了简化问题,我有两个类:User和FeedItem。用户可以有更多的FeedItem,但关系是双向的(FeedItem知道它与哪个用户关联)。他们都坚持在数据库中使用JPA + Hibernate的:Spring + JPA“超出锁定等待超时;尝试重新启动事务”

@Entity 
@Table 
public class User 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id", nullable = false, length = 8) 
    private int id; 

    @Column(nullable = false, length = 32, unique = true) 
    private String alias; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user") 
    private List<FeedItem> feedItems = new ArrayList<FeedItem>(); 

    public User() 
    { 
    } 

    public User(String alias) 
    { 
     this.alias = alias; 
    } 

    ... getters/setters... 
} 


@Entity 
@Table 
public class FeedItem 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "id", nullable = false, length = 16) 
    private int id; 

    @Column(nullable = false, length = 64) 
    private String title; 

    @ManyToOne 
    @JoinColumn(name = "userId", nullable = false) 
    private User user; 

    public FeedItem() 
    { 
    } 

    public FeedItem(String title, User user) 
    { 
     this.title = title; 
     this.user = user; 
    } 

    ... getters/setters... 
} 

的DAO中:

@Repository 
public class UserJpaDao implements UserDao 
{ 
    private EntityManager em; 

    @Transactional 
    public User save(User user) 
    { 
     return this.em.merge(user); 
    } 

    @Transactional 
    public void delete(User user) 
    { 
     this.em.remove(user); 
    } 

    @Transactional(readOnly = true) 
    public User findById(int id) 
    { 
     return this.em.find(User.class, id); 
    } 

    @PersistenceContext 
    void setEntityManager(EntityManager entityManager) 
    { 
     this.em = entityManager; 
    } 
} 


@Repository 
public class FeedItemJpaDao implements FeedItemDao 
{ 
    private EntityManager em; 

    @Transactional 
    public FeedItem save(FeedItem feedItem) 
    { 
     return this.em.merge(feedItem); 
    } 

    @Transactional 
    public void delete(FeedItem feedItem) 
    { 
     this.em.remove(feedItem); 
    } 

    @Transactional 
    public FeedItem findById(int id) 
    { 
     return this.em.find(FeedItem.class, id); 
    } 

    @PersistenceContext 
    void setEntityManager(EntityManager entityManager) 
    { 
     this.em = entityManager; 
    } 
} 

这是测试给出错误:

@RunWith(SpringJUnit4ClassRunner.class) 
public class FeedItemJpaDaoTest 
{ 
    @Autowired 
    private DriverManagerDataSource dataSource; 

    @Autowired 
    private FeedItemJpaDao feedItemDao; 

    @Autowired 
    private UserJpaDao userDao; 

    @Before 
    @Transactional 
    public void setUp() throws Exception 
    { 
     DatabaseOperation.CLEAN_INSERT.execute(getConnection(), getDataSet()); 
    } 

    @After 
    @Transactional 
    public void tearDown() throws Exception 
    { 
     DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet()); 
    } 

    @Test 
    @Transactional 
    public void testSave() throws Exception 
    { 
     User user = userDao.findById(3); 
     FeedItem feedItem = new FeedItem("Achievement unlocked!", user); 
     feedItem = feedItemDao.save(feedItem); 
     assertEquals(feedItem, feedItemDao.findById(feedItem.getId())); 
    } 

    private IDatabaseConnection getConnection() throws Exception 
    { 
     return new DatabaseConnection(dataSource.getConnection()); 
    } 

    private IDataSet getDataSet() throws Exception 
    { 
     return new FlatXmlDataSetBuilder().build(new File("src/test/resources/dataset.xml")); 
    } 
} 

我不明白为什么错误发生 - 任何建议表示赞赏!

谢谢。

编辑:好像这个问题是由于DbUnit的:如果我注释掉的删除()方法,误差不occour

+0

什么是基础数据库你正在使用?这似乎是数据库中的锁定超时问题。 – 2012-02-03 09:48:01

+0

@AbhinavSarkar MySQL – satoshi 2012-02-03 10:41:24

+0

我编辑了主要问题,好像问题是由于DbUnit造成的! – satoshi 2012-02-03 10:48:05

回答

相关问题