Data JPA 实现自定义扩展函数

This commit is contained in:
Calvin
2012-02-29 11:51:53 +08:00
parent 1aef2fe860
commit cd53dfcbb3
8 changed files with 66 additions and 29 deletions
+4 -2
View File
@@ -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
@@ -9,21 +9,5 @@ import org.springside.examples.miniweb.entity.account.Group;
* @author calvin
*/
public interface GroupDao extends PagingAndSortingRepository<Group, Long> {
//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<User> users = find(QUERY_USER_BY_GROUPID, group.getId());
for (User u : users) {
u.getGroupList().remove(group);
}
super.delete(group);
}*/
public interface GroupDao extends PagingAndSortingRepository<Group, Long>, GroupDaoCustom {
}
@@ -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);
}
@@ -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<User> users = (List<User>) em.createQuery(QUERY_USER_BY_GROUPID).setParameter(1, id).getResultList();
for (User u : users) {
u.getGroupList().remove(group);
em.persist(u);
}
em.remove(group);
}
}
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
<persistence-unit name="miniwebPU" transaction-type="RESOURCE_LOCAL">
<!-- Keep this file empty, Spring will scan the @Entity classes -->
<persistence-unit name="defaultPU" transaction-type="RESOURCE_LOCAL">
<mapping-file>META-INF/orm.xml</mapping-file>
</persistence-unit>
</persistence>
@@ -23,7 +23,7 @@
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource"
p:persistenceUnitName="miniwebPU"
p:persistenceUnitName="defaultPU"
p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter" >
<property name="jpaProperties">
<props>
@@ -101,7 +101,6 @@
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
@@ -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);
}
}
@@ -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);