diff --git a/src/main/java/cheat/Cheat.java b/src/main/java/cheat/Cheat.java
index 3eecaff..270f2fd 100644
--- a/src/main/java/cheat/Cheat.java
+++ b/src/main/java/cheat/Cheat.java
@@ -1,11 +1,14 @@
 package cheat;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.transaction.Transactional;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.EntityTransaction;
 
 import org.apache.commons.lang3.tuple.Pair;
 
@@ -19,94 +22,138 @@
 
 public class Cheat implements CheatInterfnterface {
 
-    @PersistenceContext
-    private EntityManager entityManager;
+    private EntityManagerFactory emf;
+
+    public Cheat() {
+        config cfg = new config();
+        Map<String, Object> props = new HashMap<>();
+        props.put("javax.persistence.jdbc.url",
+                "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+    }
+
+    // 测试时注入
+    public Cheat(EntityManagerFactory emf) {
+        this.emf = emf;
+    }
+
+    private EntityManager getEntityManager() {
+        return emf.createEntityManager();
+    }
 
     @Override
-    @Transactional
     public boolean AddAppeal(Appeal appeal) {
+        EntityManager em = getEntityManager();
+        EntityTransaction tx = em.getTransaction();
         try {
-            entityManager.persist(appeal);
+            tx.begin();
+            em.persist(appeal);
+            tx.commit();
         } catch (Exception e) {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
             e.printStackTrace();
             return false;
+        } finally {
+            em.close();
         }
         return true;
     }
 
     @Override
     public Appeal GetAppeal(String appealid) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
             QAppeal qAppeal = QAppeal.appeal;
             Appeal appeal = queryFactory
-                .selectFrom(qAppeal)
-                .where(qAppeal.appealid.eq(appealid))
-                .fetchOne();
+                    .selectFrom(qAppeal)
+                    .where(qAppeal.appealid.eq(appealid))
+                    .fetchOne();
             return appeal;
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            em.close();
         }
     }
 
     @Override
     public Appeal[] GetAppealList() {
+        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
             QAppeal qAppeal = QAppeal.appeal;
             List<Appeal> appeals = queryFactory
-                .selectFrom(qAppeal)
-                .fetch();
+                    .selectFrom(qAppeal)
+                    .fetch();
             return appeals.toArray(new Appeal[0]);
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            em.close();
         }
     }
 
     @Override
     public boolean HandleAppeal(String appealid, Integer status) {
+        EntityManager em = getEntityManager();
+        EntityTransaction tx = em.getTransaction();
         try {
-            Appeal appeal = GetAppeal(appealid);
+            tx.begin();
+            Appeal appeal = em.find(Appeal.class, appealid);
             if (appeal != null) {
                 appeal.status = status;
-                entityManager.merge(appeal);
-                User user = entityManager.find(User.class, appeal.appealuserid);
+                em.merge(appeal);
+                User user = em.find(User.class, appeal.appealuserid);
                 if (user != null && user.accountstate != false) {
                     if (status == 1) {
                         user.accountstate = false;
                     }
-                    entityManager.merge(user);
+                    em.merge(user);
                 }
+                tx.commit();
                 return true;
             }
             return false;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
+        } finally {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            em.close();
         }
     }
 
     @Override
     public Pair<String, String>[] GetFakeSeed() {
         List<Pair<String, String>> fakeSeeds = new ArrayList<>();
+        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
             QSeed qSeed = QSeed.seed;
             List<com.querydsl.core.Tuple> results = queryFactory
-                .select(qSeed.seedid, qSeed.seeduserid)
-                .from(qSeed)
-                .where(qSeed.faketime.gt(new config().FakeTime))
-                .fetch();
+                    .select(qSeed.seedid, qSeed.seeduserid)
+                    .from(qSeed)
+                    .where(qSeed.faketime.gt(new config().FakeTime))
+                    .fetch();
             for (com.querydsl.core.Tuple result : results) {
                 String seedid = result.get(qSeed.seedid);
-                String userid = result.get(qSeed.seeduserid);
+                String userid  = result.get(qSeed.seeduserid);
                 fakeSeeds.add(Pair.of(seedid, userid));
             }
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            em.close();
         }
         return fakeSeeds.toArray(new Pair[0]);
     }
@@ -114,20 +161,23 @@
     @Override
     public String[] GetPunishedUserList() {
         List<String> punishedUsers = new ArrayList<>();
+        EntityManager em = getEntityManager();
         try {
-            JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
+            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
             entity.QUser qUser = entity.QUser.user;
             List<String> results = queryFactory
-                .select(qUser.userid)
-                .from(qUser)
-                .where(qUser.accountstate.isTrue())
-                .fetch();
+                    .select(qUser.userid)
+                    .from(qUser)
+                    .where(qUser.accountstate.isTrue())
+                    .fetch();
             for (String userid : results) {
                 punishedUsers.add(userid);
             }
         } catch (Exception e) {
             e.printStackTrace();
             return null;
+        } finally {
+            em.close();
         }
         return punishedUsers.toArray(new String[0]);
     }
@@ -148,21 +198,17 @@
 
         //     int n = tasks.size();
         //     if (n == 0) continue;
-
         //     double[] xArr = new double[n];
         //     for (int i = 0; i < n; i++) {
         //         TransRecord t = tasks.get(i);
         //         xArr[i] = Math.max(0, t.upload - t.download);
         //     }
-
         //     double sum = 0;
         //     for (double x : xArr) sum += x;
         //     double mu = sum / n;
-
         //     double sqSum = 0;
         //     for (double x : xArr) sqSum += (x - mu) * (x - mu);
         //     double sigma = Math.sqrt(sqSum / n);
-
         //     for (int i = 0; i < n; i++) {
         //         if (Math.abs(xArr[i] - mu) > 3 * sigma) {
         //             User user = entityManager.find(User.class, tasks.get(i).downloaduserid);
@@ -177,27 +223,37 @@
     }
 
     @Override
-    public void DetectFakeSeed(){
+    public void DetectFakeSeed() {
     }
 
     @Override
-    public boolean DetectFakeSeed(String seedid){
+    public boolean DetectFakeSeed(String seedid) {
         return false;
     }
 
     @Override
-    public void PunishUser(){
-        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
-        entity.QUser qUser = entity.QUser.user;
-        List<User> users = queryFactory
-            .selectFrom(qUser)
-            .where(qUser.detectedCount.gt(new entity.config().CheatTime) 
-                .or(qUser.fakeDetectedCount.gt(new entity.config().FakeTime)))
-            .fetch();
+    public void PunishUser() {
+        EntityManager em = getEntityManager();
+        EntityTransaction tx = em.getTransaction();
+        try {
+            tx.begin();
+            JPAQueryFactory queryFactory = new JPAQueryFactory(em);
+            entity.QUser qUser = entity.QUser.user;
+            List<User> users = queryFactory
+                    .selectFrom(qUser)
+                    .where(qUser.detectedCount.gt(new entity.config().CheatTime)
+                            .or(qUser.fakeDetectedCount.gt(new entity.config().FakeTime)))
+                    .fetch();
 
-        for (User user : users) {
-            user.accountstate = true;
-            entityManager.merge(user);
+            for (User user : users) {
+                user.accountstate = true;
+                em.merge(user);
+            }
+            tx.commit();
+        } catch (Exception e) {
+            if (tx.isActive()) tx.rollback();
+        } finally {
+            em.close();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index ae1fe94..766c90a 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -1,12 +1,12 @@
 package database;
 
-// import java.lang.invoke.TypeDescriptor;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
 
 import com.querydsl.jpa.impl.JPAQuery;
 
@@ -25,42 +25,66 @@
 import entity.UserStar;
 
 public class Database1 implements DataManagerInterface {
-    @PersistenceContext
-    private EntityManager entitymanager;
+
+    private EntityManagerFactory emf;
+
+    public Database1() {
+        entity.config cfg = new entity.config();
+        Map<String, Object> props = new HashMap<>();
+        props.put("javax.persistence.jdbc.url", "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+    }
+
+    // 方便测试时注入
+    public Database1(EntityManagerFactory emf) {
+        this.emf = emf;
+    }
+
+    private EntityManager getEntityManager() {
+        return emf.createEntityManager();
+    }
 
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
-    public int RegisterUser(User userinfo){
-        try{
-            JPAQuery<String> query = new JPAQuery<>(entitymanager);
+    public int RegisterUser(User userinfo) {
+        EntityManager em = getEntityManager();
+        try {
+            JPAQuery<String> query = new JPAQuery<>(em);
             QUser u = QUser.user;
             List<String> allEmails = query.select(u.email).from(u).fetch();
 
-            if(allEmails.contains(userinfo.email)){
+            if (allEmails.contains(userinfo.email)) {
                 return 1;
             }
-            entitymanager.persist(userinfo);
+            em.getTransaction().begin();
+            em.persist(userinfo);
+            em.getTransaction().commit();
             return 0;
 
-        }catch(Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     // 返回状态：0 success，1 不存在，2其他原因
     @Override
-    public int UpdateInformation(User userinfo){
+    public int UpdateInformation(User userinfo) {
+        EntityManager em = getEntityManager();
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            JPAQuery<User> query = new JPAQuery<>(entitymanager);
+            JPAQuery<User> query = new JPAQuery<>(em);
             QUser u = QUser.user;
             User updateUser = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
 
-            if(updateUser == null){
+            if (updateUser == null) {
                 return 1;
             }
             // 只更新需要的字段，避免破坏持久化状态和关联关系
@@ -74,242 +98,305 @@
             updateUser.accountstate = userinfo.accountstate;
             updateUser.invitetimes = userinfo.invitetimes;
             // 如有其他字段也一并赋值
-            entitymanager.merge(updateUser);
+            em.getTransaction().begin();
+            em.merge(updateUser);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     // 返回用户的全部基本信息
     @Override
-    public User GetInformation(String userid){
-        User user = entitymanager.find(User.class, userid);
-        return user;
+    public User GetInformation(String userid) {
+        EntityManager em = getEntityManager();
+        try {
+            User user = em.find(User.class, userid);
+            return user;
+        } finally {
+            em.close();
+        }
     }
 
     //返回用户的全部pt站信息
     @Override
-    public UserPT GetInformationPT(String userid){
-        UserPT userPT = entitymanager.find(UserPT.class, userid);
-        return userPT;
+    public UserPT GetInformationPT(String userid) {
+        EntityManager em = getEntityManager();
+        try {
+            UserPT userPT = em.find(UserPT.class, userid);
+            return userPT;
+        } finally {
+            em.close();
+        }
     }
 
     //返回状态：0 success，1 邮箱重复，2其他原因
     @Override
-    public int UpdateInformationPT(UserPT userinfo){
-        try{
-            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
+    public int UpdateInformationPT(UserPT userinfo) {
+        EntityManager em = getEntityManager();
+        try {
+            JPAQuery<UserPT> query = new JPAQuery<>(em);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
-        
-            if(userPT == null){
+
+            if (userPT == null) {
                 return 1;
             }
             userPT = userinfo;
-            entitymanager.merge(userPT);
+            em.getTransaction().begin();
+            em.merge(userPT);
+            em.getTransaction().commit();
             return 0;
 
-        }catch(Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
     }
 
     //返回状态：0 success，1 id重复，2其他原因
     @Override
-    public int RegisterUserPT(UserPT userinfo){
+    public int RegisterUserPT(UserPT userinfo) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
+            JPAQuery<UserPT> query = new JPAQuery<>(em);
             QUserPT u = QUserPT.userPT;
             UserPT checkUserPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
             if (checkUserPT != null) {
                 return 1;
             }
-            entitymanager.persist(userinfo);
+            em.getTransaction().begin();
+            em.persist(userinfo);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
     }
 
     //返回种子的全部信息
     @Override
-    public Seed GetSeedInformation(String seedid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
-        return seed;
+    public Seed GetSeedInformation(String seedid) {
+        EntityManager em = getEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            Seed seed = query.select(s).from(s).where(s.seedid.eq(seedid)).fetchOne();
+            return seed;
+        } finally {
+            em.close();
+        }
     }
 
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
-    public int RegisterSeed(Seed seedinfo){
+    public int RegisterSeed(Seed seedinfo) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+            JPAQuery<Seed> query = new JPAQuery<>(em);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
             if (seed != null) {
                 return 1;
             }
-            entitymanager.persist(seedinfo);
+            em.getTransaction().begin();
+            em.persist(seedinfo);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
     }
 
     //接收新的种子然后更新其全部属性
     @Override
-    public int UpdateSeed(Seed seedinfo){
+    public int UpdateSeed(Seed seedinfo) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
+            JPAQuery<Seed> query = new JPAQuery<>(em);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
             if (seed == null) {
                 return 1;
             }
             seed = seedinfo;
-            entitymanager.merge(seed);
+            em.getTransaction().begin();
+            em.merge(seed);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
     }
 
     //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     @Override
-    public Seed[] SearchSeed(String userQ){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).fetch();
+    public Seed[] SearchSeed(String userQ) {
+        EntityManager em = getEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            List<Seed> seeds = query.select(s).from(s).fetch();
 
-        if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+            if (seeds == null || userQ == null || userQ.trim().isEmpty()) {
+                return seeds.toArray(new Seed[0]);
+            }
+
+            String processedQuery = userQ.toLowerCase().trim();
+            Map<Seed, Integer> seedCountMap = new HashMap<>();
+            for (Seed seed : seeds) {
+                String title = seed.title.toLowerCase().trim();
+                int count = countCommonCharacter(processedQuery, title);
+                seedCountMap.put(seed, count);
+            }
+            seeds.sort((s1, s2) -> {
+                int count1 = seedCountMap.getOrDefault(s1, 0);
+                int count2 = seedCountMap.getOrDefault(s2, 0);
+                return Integer.compare(count2, count1);
+            });
+
             return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
         }
-
-        String processedQuery = userQ.toLowerCase().trim();
-        Map<Seed, Integer> seedCountMap = new HashMap<>();
-        for(Seed seed : seeds){
-            String title = seed.title.toLowerCase().trim();
-            int count = countCommonCharacter(processedQuery, title);
-            seedCountMap.put(seed, count);
-        }
-        seeds.sort((s1, s2) -> {
-            int count1 = seedCountMap.getOrDefault(s1, 0);
-            int count2 = seedCountMap.getOrDefault(s2, 0);
-            return Integer.compare(count2, count1);
-        });
-
-        return seeds.toArray(new Seed[0]);
     }
 
     //计算字符串公共字符数量
-    private int countCommonCharacter(String str1, String str2){
+    private int countCommonCharacter(String str1, String str2) {
         Map<Character, Integer> map1 = new HashMap<>();
         Map<Character, Integer> map2 = new HashMap<>();
 
-        for(char c : str1.toCharArray()){
+        for (char c : str1.toCharArray()) {
             if (!Character.isWhitespace(c)) {
                 map1.put(c, map1.getOrDefault(c, 0) + 1);
             }
         }
 
-        for(char c : str2.toCharArray()){
+        for (char c : str2.toCharArray()) {
             if (!Character.isWhitespace(c)) {
                 map2.put(c, map2.getOrDefault(c, 0) + 1);
             }
         }
 
         int res = 0;
-        for(char c : map1.keySet()){
+        for (char c : map1.keySet()) {
             if (map2.containsKey(c)) {
                 res += Math.min(map1.get(c), map2.get(c));
             }
-            
+
         }
         return res;
     }
 
     //返回状态：0 success，1 重复，2其他原因
     @Override
-    public int AddNotice(Notice notice){
+    public int AddNotice(Notice notice) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
+            JPAQuery<Notice> query = new JPAQuery<>(em);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
             if (checkNotice != null) {
                 return 1;
             }
-            
-            entitymanager.persist(notice);
+
+            em.getTransaction().begin();
+            em.persist(notice);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     //返回状态：0 success，1 不存在，2其他原因
     @Override
-    public boolean UpdateNotice(Notice notice){
+    public boolean UpdateNotice(Notice notice) {
+        EntityManager em = getEntityManager();
         try {
-            Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
+            Notice oldNotice = em.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
             }
             oldNotice = notice;
-            entitymanager.merge(oldNotice);
+            em.getTransaction().begin();
+            em.merge(oldNotice);
+            em.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
+        } finally {
+            em.close();
         }
     }
 
     //删除公告，返回状态：0 success，1 不存在，2其他原因
     @Override
-    public boolean DeleteNotice(String noticeid){
+    public boolean DeleteNotice(String noticeid) {
+        EntityManager em = getEntityManager();
         try {
-            Notice notice = entitymanager.find(Notice.class, noticeid);
+            Notice notice = em.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
             }
-            entitymanager.remove(notice);
+            em.getTransaction().begin();
+            em.remove(notice);
+            em.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     //获取用户的剩余邀请次数
-    public int GetUserAvailableInviteTimes(String userid){
+    public int GetUserAvailableInviteTimes(String userid) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
+            JPAQuery<Integer> query = new JPAQuery<>(em);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
-            
+
             return invite_left;
         } catch (Exception e) {
             e.printStackTrace();
             return -1;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     //邀请用户，返回状态：0 success，1 剩余次数不足，2,3其他原因
     @Override
-    public int InviteUser(String inviterid,String inviteemail){
+    public int InviteUser(String inviterid, String inviteemail) {
+        EntityManager em = getEntityManager();
         try {
-            User user = entitymanager.find(User.class, inviterid);
+            User user = em.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
             }
@@ -317,158 +404,176 @@
                 return 1;
             }
             user.invitetimes -= 1;
-            entitymanager.merge(user);
+            em.getTransaction().begin();
+            em.merge(user);
+            em.getTransaction().commit();
             return 0;
         } catch (Exception e) {
             e.printStackTrace();
             return 2;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean AddCollect(String userid,String seedid){
-        JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
-        QUser u2 = QUser.user;
-        User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
-        if (user == null) {
-            return false;
-        }
-        JPAQuery<Seed> query3 = new JPAQuery<>(entitymanager);
-        QSeed p = QSeed.seed;
-        Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
-        if (seed == null) {
-            return false;
-        }
-        JPAQuery<String> query = new JPAQuery<>(entitymanager);
-        QUserStar u = QUserStar.userStar;
-        List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
+    public boolean AddCollect(String userid, String seedid) {
+        EntityManager em = getEntityManager();
+        try {
+            JPAQuery<User> query2 = new JPAQuery<>(em);
+            QUser u2 = QUser.user;
+            User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
+            if (user == null) {
+                return false;
+            }
+            JPAQuery<Seed> query3 = new JPAQuery<>(em);
+            QSeed p = QSeed.seed;
+            Seed seed = query3.select(p).from(p).where(p.seedid.eq(seedid)).fetchOne();
+            if (seed == null) {
+                return false;
+            }
+            JPAQuery<String> query = new JPAQuery<>(em);
+            QUserStar u = QUserStar.userStar;
+            List<String> allSeedId = query.select(u.seedid).from(u).where(u.userid.eq(userid)).fetch();
 
-        if (allSeedId.contains(seedid)) {
+            if (allSeedId.contains(seedid)) {
+                return false;
+            }
+            UserStar userStar = new UserStar();
+            userStar.userid = userid;
+            userStar.seedid = seedid;
+            em.getTransaction().begin();
+            em.persist(userStar);
+            em.getTransaction().commit();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
             return false;
+        } finally {
+            em.close();
         }
-        UserStar userStar = new UserStar();
-        userStar.userid = userid;
-        userStar.seedid = seedid;
-        entitymanager.persist(userStar);
-        return true;
     }
 
     //删除一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
-    public boolean DeleteCollect(String userid,String seedid){
+    public boolean DeleteCollect(String userid, String seedid) {
+        EntityManager em = getEntityManager();
         try {
-            JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
+            JPAQuery<UserStar> query = new JPAQuery<>(em);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
             if (userStar == null) {
                 return true; // 收藏不存在
             }
-            entitymanager.remove(userStar);
+            em.getTransaction().begin();
+            em.remove(userStar);
+            em.getTransaction().commit();
             return true;
         } catch (Exception e) {
             e.printStackTrace();
             return false;
+        } finally {
+            em.close();
         }
-        
+
     }
 
     @Override
-    public int AddBegSeed(BegInfo info){
+    public int AddBegSeed(BegInfo info) {
         return 0;
     }
 
     @Override
-    public int UpdateBegSeed(BegInfo info){
+    public int UpdateBegSeed(BegInfo info) {
         return 0;
     }
 
     @Override
-    public int DeleteBegSeed(String begid){
+    public int DeleteBegSeed(String begid) {
         return 0;
     }
 
     @Override
-    public int VoteSeed(String begId, String seedId, String userId){
+    public int VoteSeed(String begId, String seedId, String userId) {
         return 0;
     }
 
     @Override
-    public int SubmitSeed(String begid,Seed seed){
+    public int SubmitSeed(String begid, Seed seed) {
         return 0;
     }
 
     @Override
-    public void SettleBeg(){
-        
+    public void SettleBeg() {
+
     }
 
     @Override
-    public int AddPost(Post post){
+    public int AddPost(Post post) {
         return 0;
     }
 
     @Override
-    public int UpdatePost(Post post){
+    public int UpdatePost(Post post) {
         return 0;
     }
 
     @Override
-    public int DeletePost(String postid){
+    public int DeletePost(String postid) {
         return 0;
     }
 
     @Override
-    public int AddComment(String postid, String userid, String comment){
+    public int AddComment(String postid, String userid, String comment) {
         return 0;
     }
 
     @Override
-    public int DeleteComment(String postid,String commentid){
+    public int DeleteComment(String postid, String commentid) {
         return 0;
     }
 
     @Override
-    public boolean ExchangeMagicToUpload(String userid,int magic)//将魔力值兑换为上传量，返回状态：0 success，1 不存在,2其他原因
+    public boolean ExchangeMagicToUpload(String userid, int magic)//将魔力值兑换为上传量，返回状态：0 success，1 不存在,2其他原因
     {
         return true;
     }
-    
+
     @Override
-    public boolean ExchangeMagicToDownload(String userid,int magic)
-    {
+    public boolean ExchangeMagicToDownload(String userid, int magic) {
         return true;
     }//将魔力值兑换为下载量，返回状态：0 success，1 不存在,2其他原因
 
     @Override
-    public boolean ExchangeMagicToVip(String userid,int magic){
+    public boolean ExchangeMagicToVip(String userid, int magic) {
         return true;
     }
     //将魔力值兑换为VIP次数，返回状态：0 success，1 不存在,2其他原因
 
     @Override
-    public boolean UploadTransmitProfile(Profile profile){
+    public boolean UploadTransmitProfile(Profile profile) {
         return true;
     }
 
     @Override
-    public Profile GetTransmitProfile(String profileid){
+    public Profile GetTransmitProfile(String profileid) {
         Profile profile = new Profile();
         return profile;
     }
     //获取迁移信息
-    
+
     @Override
-    public boolean ExamTransmitProfile(String profileid,boolean result){
+    public boolean ExamTransmitProfile(String profileid, boolean result) {
         return true;
     }
+
     //审核迁移信息,0成功，1失败
     @Override
-    public Profile[] GetTransmitProfileList(){
+    public Profile[] GetTransmitProfileList() {
         return new Profile[0];
     }
     //获取所有迁移信息
 
 }
-
