diff --git a/src/main/java/database/Database1.java b/src/main/java/database/Database1.java
index 580f9e8..b91e471 100644
--- a/src/main/java/database/Database1.java
+++ b/src/main/java/database/Database1.java
@@ -39,15 +39,15 @@
 import entity.config;
 import entity.PostReply;
 import entity.QPostReply;
+import entity.UserInvite;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class Database1 implements DataManagerInterface {
-    @PersistenceContext
-    private final EntityManager entitymanager;
     private static final Logger logger = LoggerFactory.getLogger(Database1.class);
     private EntityManagerFactory emf;
+    
     public Database1() {
         config cfg = new config();
         Map<String,Object> props = new HashMap<>();
@@ -55,9 +55,15 @@
                   "jdbc:mysql://" + cfg.SqlURL + "/" + cfg.Database);
         props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
         props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
-        this.entitymanager = Persistence.createEntityManagerFactory("myPersistenceUnit", props).createEntityManager();
-        // this.emf=entitymanager;
+        // 只创建一个 EntityManagerFactory，为每个操作创建新的 EntityManager
+        this.emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
     }
+    
+    // 为每个操作创建新的 EntityManager 以避免线程安全问题
+    private EntityManager createEntityManager() {
+        return emf.createEntityManager();
+    }
+
     @Override
     public String LoginUser(User userinfo){
         try {
@@ -73,6 +79,7 @@
                 return null;
             }
             
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             User foundUser = null;
@@ -97,14 +104,15 @@
     // 返回状态：0 success，1 邮箱重复，2其他原因
     @Override
     public int RegisterUser(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try{
             // 首先检查该邮箱是否在UserInvite表中被邀请过
-            JPAQuery<String> inviteQuery = new JPAQuery<>(entitymanager);
+            JPAQuery<UserInvite> inviteQuery = new JPAQuery<>(entitymanager);
             QUserInvite ui = QUserInvite.userInvite;
-            List<String> invitedEmails = inviteQuery.select(ui.inviterEmail).from(ui).fetch();
+            List<UserInvite> UserInvites = inviteQuery.select(ui).from(ui).where(ui.inviterEmail.eq(userinfo.email)).fetch();
 
             // 如果邮箱不在被邀请列表中，拒绝注册
-            if(!invitedEmails.contains(userinfo.email)){
+            if(UserInvites.isEmpty()){
                 return 2; // 未被邀请
             }
 
@@ -117,8 +125,23 @@
                 return 1; // 邮箱重复
             }
 
+            UserPT userPT = new UserPT();
+            userPT.userid = userinfo.userid;
+            userPT.magic = 0; // 设置默认值
+            userPT.upload = 0; // 设置默认值
+            userPT.download = 0; // 设置默认值
+            userPT.share = 0.0; // 设置默认值
+            userPT.user = userinfo; // 设置关联关系
+            userPT.farmurl = ""; // 设置默认值
+            userPT.viptime = 0; // 设置默认值
+
             entitymanager.getTransaction().begin();
             entitymanager.persist(userinfo);
+            entitymanager.persist(userPT);
+            // 删除所有匹配的邀请记录
+            for (UserInvite invite : UserInvites) {
+                entitymanager.remove(invite);
+            }
             entitymanager.getTransaction().commit();
             return 0; // 注册成功
 
@@ -135,11 +158,12 @@
     // 返回状态：0 success，1 不存在，2其他原因
     @Override
     public int UpdateInformation(User userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             if (userinfo.userid == null) {
                 return 2; // userid为null直接返回错误
             }
-            
+
             entitymanager.getTransaction().begin();
             
             JPAQuery<User> query = new JPAQuery<>(entitymanager);
@@ -177,6 +201,7 @@
     // 返回用户的全部基本信息
     @Override
     public User GetInformation(String userid){
+        EntityManager entitymanager = createEntityManager();
         User user = entitymanager.find(User.class, userid);
         return user;
     }
@@ -184,6 +209,7 @@
     //返回用户的全部pt站信息
     @Override
     public UserPT GetInformationPT(String userid){
+        EntityManager entitymanager = createEntityManager();
         UserPT userPT = entitymanager.find(UserPT.class, userid);
         return userPT;
     }
@@ -192,6 +218,7 @@
     @Override
     public int UpdateInformationPT(UserPT userinfo){
         try{
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserPT> query = new JPAQuery<>(entitymanager);
             QUserPT u = QUserPT.userPT;
             UserPT userPT = query.select(u).from(u).where(u.userid.eq(userinfo.userid)).fetchOne();
@@ -212,6 +239,7 @@
     //返回状态：0 success，1 id重复，2其他原因
     @Override
     public int RegisterUserPT(UserPT userinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             
@@ -238,30 +266,58 @@
     //返回种子的全部信息
     @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;
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            Seed seed = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedid.eq(seedid)).fetchOne();
+            return seed;
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByTag(String tag){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seedtag.eq(tag)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seedtag.eq(tag)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public Seed[] GetSeedListByUser(String userid){
-        JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
-        QSeed s = QSeed.seed;
-        List<Seed> seeds = query.select(s).from(s).where(s.seeduserid.eq(userid)).fetch();
-        return seeds.toArray(new Seed[0]);
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .where(s.seeduserid.eq(userid)).fetch();
+            return seeds.toArray(new Seed[0]);
+        } finally {
+            em.close();
+        }
     }
 
     @Override
     public int DeleteSeed(String seedid){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             Seed seed = entitymanager.find(Seed.class, seedid);
@@ -284,6 +340,7 @@
     //添加一个新的种子，0成功，其他失败信息待定;
     @Override
     public int RegisterSeed(Seed seedinfo){
+        EntityManager entitymanager = createEntityManager();
         try {
             entitymanager.getTransaction().begin();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
@@ -315,6 +372,7 @@
     @Override
     public int UpdateSeed(Seed seedinfo){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Seed> query = new JPAQuery<>(entitymanager);
             QSeed s = QSeed.seed;
             Seed seed = query.select(s).from(s).where(s.seedid.eq(seedinfo.seedid)).fetchOne();
@@ -333,28 +391,37 @@
     //传入搜索的关键词或句子，返回搜索到的种子信息（按照公共字符数量排序）
     @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();
+        EntityManager em = createEntityManager();
+        try {
+            JPAQuery<Seed> query = new JPAQuery<>(em);
+            QSeed s = QSeed.seed;
+            QUser u = QUser.user;
+            // 使用 fetch join 预先加载关联的 user 对象，避免懒加载导致的 ResultSet closed 错误
+            List<Seed> seeds = query.select(s).from(s)
+                    .leftJoin(s.user, u).fetchJoin()
+                    .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]);
     }
 
     //计算字符串公共字符数量
@@ -388,6 +455,7 @@
     @Override
     public int AddNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Notice> query = new JPAQuery<>(entitymanager);
             QNotice n = QNotice.notice;
             Notice checkNotice = query.select(n).from(n).where(n.noticeid.eq(notice.noticeid)).fetchOne();
@@ -408,6 +476,7 @@
     @Override
     public boolean UpdateNotice(Notice notice){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice oldNotice = entitymanager.find(Notice.class, notice.noticeid);
             if (oldNotice == null) {
                 return false;
@@ -425,6 +494,7 @@
     @Override
     public boolean DeleteNotice(String noticeid){
         try {
+            EntityManager entitymanager = createEntityManager();
             Notice notice = entitymanager.find(Notice.class, noticeid);
             if (notice == null) {
                 return false;
@@ -441,6 +511,7 @@
     //获取用户的剩余邀请次数
     public int GetUserAvailableInviteTimes(String userid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<Integer> query = new JPAQuery<>(entitymanager);
             QUser u = QUser.user;
             int invite_left = query.select(u.invitetimes).from(u).where(u.userid.eq(userid)).fetchOne();
@@ -457,6 +528,7 @@
     @Override
     public int InviteUser(String inviterid,String inviteemail){
         try {
+            EntityManager entitymanager = createEntityManager();
             User user = entitymanager.find(User.class, inviterid);
             if (user == null || !user.email.equals(inviteemail)) {
                 return 3;
@@ -477,6 +549,7 @@
     //添加一个收藏，返回状态：0 success，1 不存在,2其他原因
     @Override
     public boolean AddCollect(String userid,String seedid){
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<User> query2 = new JPAQuery<>(entitymanager);
         QUser u2 = QUser.user;
         User user = query2.select(u2).from(u2).where(u2.userid.eq(userid)).fetchOne();
@@ -507,6 +580,7 @@
     @Override
     public boolean DeleteCollect(String userid,String seedid){
         try {
+            EntityManager entitymanager = createEntityManager();
             JPAQuery<UserStar> query = new JPAQuery<>(entitymanager);
             QUserStar u = QUserStar.userStar;
             UserStar userStar = query.select(u).from(u).where(u.userid.eq(userid).and(u.seedid.eq(seedid))).fetchOne();
@@ -532,6 +606,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -577,6 +652,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -619,6 +695,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -657,6 +734,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -717,6 +795,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -771,6 +850,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -844,6 +924,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -894,6 +975,7 @@
         EntityTransaction tx = null;
 
         try {
+            EntityManager entitymanager = createEntityManager();
             tx = entitymanager.getTransaction();
             tx.begin();
 
@@ -1426,6 +1508,7 @@
 
     @Override
     public Post[] GetPostList() {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         List<Post> posts = query.select(p).from(p).fetch();
@@ -1434,6 +1517,7 @@
 
     @Override
     public Post GetPost(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<Post> query = new JPAQuery<>(entitymanager);
         QPost p = QPost.post;
         Post post = query.select(p).from(p).where(p.postid.eq(postid)).fetchOne();
@@ -1442,10 +1526,38 @@
 
     @Override
     public PostReply[] GetPostReplyList(String postid) {
+        EntityManager entitymanager = createEntityManager();
         JPAQuery<PostReply> query = new JPAQuery<>(entitymanager);
         QPostReply p = QPostReply.postReply;
         List<PostReply> replies = query.select(p).from(p).where(p.postid.eq(postid)).fetch();
         return replies.toArray(new PostReply[0]);
     }
+
+    @Override
+    public Post[] SearchPost(String postQ) {
+        EntityManager entitymanager = createEntityManager();
+        JPAQuery<Post> query = new JPAQuery<>(entitymanager);
+        QPost p = QPost.post;
+        List<Post> posts = query.select(p).from(p).fetch();
+
+        if (posts == null || postQ == null || postQ.trim().isEmpty()) {
+            return posts.toArray(new Post[0]);
+        }
+
+        String processedQuery = postQ.toLowerCase().trim();
+        Map<Post, Integer> postCountMap = new HashMap<>();
+        for(Post post : posts){
+            String title = post.posttitle.toLowerCase().trim();
+            int count = countCommonCharacter(processedQuery, title);
+            postCountMap.put(post, count);
+        }
+        posts.sort((s1, s2) -> {
+            int count1 = postCountMap.getOrDefault(s1, 0);
+            int count2 = postCountMap.getOrDefault(s2, 0);
+            return Integer.compare(count2, count1);
+        });
+
+        return posts.toArray(new Post[0]);
+    }
 }
 
