Data JPA 实现自定义扩展函数
This commit is contained in:
@@ -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
|
||||
|
||||
+1
-17
@@ -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 {
|
||||
}
|
||||
|
||||
+13
@@ -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);
|
||||
|
||||
}
|
||||
+32
@@ -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}" />
|
||||
|
||||
+3
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+10
-4
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user