diff --git a/TODO.txt b/TODO.txt index 3179e37c..2824eeb8 100644 --- a/TODO.txt +++ b/TODO.txt @@ -6,8 +6,9 @@ TODO部分: 1.主要改动 * 引入Profile管理環境 - * 用Spring Data JPA代替BaseDao基类,清理Hibernate基类及相关 - --GroupDao + * 用Spring Data JPA代替BaseDao基类 + --Showcase + --清理相关类 2.次要改动 * 初始化数据不要再依赖Ant @@ -64,6 +65,7 @@ TODO部分: * 升级Jquery-validation用法?? * JPA2.0特征 * Hash与加密要加入salt + * UT只初始化一次數據 * 用JUnit自带的Catetory的演示,Harmset演示 * Selenium使用自带的Wait类, 检查新版API变化 * 更深入演示PowerMock diff --git a/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDao.java b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDao.java index 092f649d..d27d7da6 100644 --- a/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDao.java +++ b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDao.java @@ -9,21 +9,5 @@ import org.springside.examples.miniweb.entity.account.Group; * @author calvin */ -public interface GroupDao extends PagingAndSortingRepository { - - //private static final String QUERY_USER_BY_GROUPID = "select u from User u left join u.groupList g where g.id=?"; - - /** - * 重载函数, 因为Group中没有建立与User的关联,因此需要以较低效率的方式进行删除User与Group的多对多中间表中的数据. - */ - /*@Override - public void delete(Long id) { - Group group = get(id); - //查询出拥有该权限组的用户,并删除该用户的权限组. - List users = find(QUERY_USER_BY_GROUPID, group.getId()); - for (User u : users) { - u.getGroupList().remove(group); - } - super.delete(group); - }*/ +public interface GroupDao extends PagingAndSortingRepository, GroupDaoCustom { } diff --git a/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoCustom.java b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoCustom.java new file mode 100644 index 00000000..40aa6f86 --- /dev/null +++ b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoCustom.java @@ -0,0 +1,13 @@ +package org.springside.examples.miniweb.dao.account; + +import org.springframework.data.repository.NoRepositoryBean; + +@NoRepositoryBean +public interface GroupDaoCustom { + + /** + * 因为Group中没有建立与User的关联,因此需要以较低效率的方式进行删除User与Group的多对多中间表中的数据. + */ + void deleteWithReference(Long id); + +} diff --git a/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoImpl.java b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoImpl.java new file mode 100644 index 00000000..b5a60e86 --- /dev/null +++ b/examples/mini-web/src/main/java/org/springside/examples/miniweb/dao/account/GroupDaoImpl.java @@ -0,0 +1,32 @@ +package org.springside.examples.miniweb.dao.account; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.springframework.stereotype.Component; +import org.springside.examples.miniweb.entity.account.Group; +import org.springside.examples.miniweb.entity.account.User; + +@Component +public class GroupDaoImpl implements GroupDaoCustom { + + private static final String QUERY_USER_BY_GROUPID = "select u from User u left join u.groupList g where g.id=?"; + + @PersistenceContext + private EntityManager em; + + @Override + public void deleteWithReference(Long id) { + //因為Group中沒有与User的关联,只能用笨办法,查询出拥有该权限组的用户, 并删除该用户的权限组. + Group group = em.find(Group.class, id); + List users = (List) em.createQuery(QUERY_USER_BY_GROUPID).setParameter(1, id).getResultList(); + for (User u : users) { + u.getGroupList().remove(group); + em.persist(u); + } + em.remove(group); + } + +} diff --git a/examples/mini-web/src/main/resources/META-INF/persistence.xml b/examples/mini-web/src/main/resources/META-INF/persistence.xml index ff96de22..e6d6e1d7 100644 --- a/examples/mini-web/src/main/resources/META-INF/persistence.xml +++ b/examples/mini-web/src/main/resources/META-INF/persistence.xml @@ -1,7 +1,8 @@ - + + META-INF/orm.xml \ No newline at end of file diff --git a/examples/mini-web/src/main/resources/applicationContext.xml b/examples/mini-web/src/main/resources/applicationContext.xml index 3423bbcb..50ce910e 100644 --- a/examples/mini-web/src/main/resources/applicationContext.xml +++ b/examples/mini-web/src/main/resources/applicationContext.xml @@ -23,7 +23,7 @@ @@ -101,7 +101,6 @@ - diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/JpaMappingTest.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/JpaMappingTest.java index 5a33839f..14288054 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/JpaMappingTest.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/JpaMappingTest.java @@ -20,15 +20,15 @@ public class JpaMappingTest extends SpringTxTestCase { private static Logger logger = LoggerFactory.getLogger(JpaMappingTest.class); @PersistenceContext - private EntityManager entityManager; + private EntityManager em; @Test public void allClassMapping() throws Exception { Fixtures.reloadAllTable(dataSource, "/data/sample-data.xml"); - Metamodel model = entityManager.getEntityManagerFactory().getMetamodel(); + Metamodel model = em.getEntityManagerFactory().getMetamodel(); for (EntityType entityType : model.getEntities()) { String entityName = entityType.getName(); - entityManager.createQuery("select o from " + entityName + " o").getFirstResult(); + em.createQuery("select o from " + entityName + " o").getFirstResult(); logger.info("ok: " + entityName); } } diff --git a/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/account/GroupDaoTest.java b/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/account/GroupDaoTest.java index 11819df5..9b7a61fc 100644 --- a/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/account/GroupDaoTest.java +++ b/examples/mini-web/src/test/java/org/springside/examples/miniweb/dao/account/GroupDaoTest.java @@ -2,8 +2,10 @@ package org.springside.examples.miniweb.dao.account; import static org.junit.Assert.*; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ActiveProfiles; @@ -29,6 +31,9 @@ public class GroupDaoTest extends SpringTxTestCase { @Autowired private UserDao userDao; + @PersistenceContext + private EntityManager em; + /** * 载入测试数据. */ @@ -41,8 +46,6 @@ public class GroupDaoTest extends SpringTxTestCase { * 测试删除权限组时删除用户-权限组的中间表. */ @Test - //TODO - @Ignore("Ignore for change to Spring Data JPA,bring it back later") public void deleteGroup() { //新增测试权限组并与admin用户绑定. Group group = AccountData.getRandomGroup(); @@ -51,13 +54,16 @@ public class GroupDaoTest extends SpringTxTestCase { User user = userDao.findOne(1L); user.getGroupList().add(group); userDao.save(user); + em.flush(); int oldJoinTableCount = countRowsInTable("ACCT_USER_GROUP"); int oldUserTableCount = countRowsInTable("ACCT_USER"); //删除用户权限组, 中间表将减少1条记录,而用户表应该不受影响. - groupDao.delete(group.getId()); + groupDao.deleteWithReference(group.getId()); + em.flush(); + user = userDao.findOne(1L); int newJoinTableCount = countRowsInTable("ACCT_USER_GROUP"); int newUserTableCount = countRowsInTable("ACCT_USER"); assertEquals(1, oldJoinTableCount - newJoinTableCount);