diff --git a/src/test/java/databasetest/databasesystest.java b/src/test/java/databasetest/databasesystest.java
new file mode 100644
index 0000000..f802360
--- /dev/null
+++ b/src/test/java/databasetest/databasesystest.java
@@ -0,0 +1,1154 @@
+package databasetest;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+
+import database.Database1;
+import entity.User;
+import entity.config;
+
+public class databasesystest {
+    private static EntityManagerFactory emf;
+    private static EntityManager em;
+    private static Database1 db;
+    private static List<String> testUserIds;
+    private static List<String> testEmails;
+
+    @BeforeAll
+    static void setup() throws Exception {
+        Class.forName("com.mysql.cj.jdbc.Driver");
+        config cfg = new config();
+        Map<String, Object> props = new HashMap<>();
+        String jdbcUrl = String.format(
+                "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
+                cfg.SqlURL, cfg.TestDatabase);
+        props.put("javax.persistence.jdbc.url", jdbcUrl);
+        props.put("javax.persistence.jdbc.user", cfg.SqlUsername);
+        props.put("javax.persistence.jdbc.password", cfg.SqlPassword);
+        props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
+        emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
+        em = emf.createEntityManager();
+        db = new Database1();
+        java.lang.reflect.Field f = Database1.class.getDeclaredField("entitymanager");
+        f.setAccessible(true);
+        f.set(db, em);
+        testUserIds = new ArrayList<>();
+        testEmails = new ArrayList<>();
+        for (int i = 0; i < 10; i++) {
+            String id = "test_user_" + i + "_" + UUID.randomUUID();
+            if (id.length() > 36) id = id.substring(0, 36);
+            testUserIds.add(id);
+            testEmails.add("test_email_" + i + "@example.com");
+        }
+    }
+
+    @AfterAll
+    static void teardown() {
+        EntityTransaction tx = em.getTransaction();
+        tx.begin();
+        for (String uid : testUserIds) {
+            User found = em.find(User.class, uid);
+            if (found != null) em.remove(found);
+        }
+        tx.commit();
+        if (em != null && em.isOpen()) em.close();
+        if (emf != null && emf.isOpen()) emf.close();
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testRegisterUser() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("RegisterUser test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false; // 必填
+                user.invitetimes = 5;      // 必填
+                // 关键：补充userPT字段，避免not-null property异常
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                // 正常注册
+                int ret = db.RegisterUser(user);
+                Assertions.assertEquals(0, ret, "RegisterUser should return 0 for success");
+                // 再次注册同邮箱用户应返回1
+                User user2 = new User();
+                String userId2 = userId + "_dup";
+                if (userId2.length() > 36) userId2 = userId2.substring(0, 36);
+                user2.userid = userId2;
+                user2.email = testEmails.get(i);
+                user2.username = "user_dup" + i;
+                user2.password = "pwd_dup" + i;
+                user2.sex = "f";
+                user2.school = "school_dup" + i;
+                user2.pictureurl = null;
+                user2.profile = null;
+                user2.accountstate = false; // 必填
+                user2.invitetimes = 5;      // 必填
+                int ret2 = db.RegisterUser(user2);
+                Assertions.assertEquals(1, ret2, "RegisterUser should return 1 for duplicate email");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testUpdateInformation() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("UpdateInformation test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个用户
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.flush();
+                // 更新信息
+                User updated = new User();
+                updated.userid = userId;
+                updated.email = testEmails.get(i);
+                updated.username = "user_updated" + i;
+                updated.password = "newpassword" + i;
+                updated.sex = "f";
+                updated.school = "MIT" + i;
+                updated.pictureurl = "https://cdn.example.com/avatars/user_new" + i + ".jpg";
+                updated.profile = "Updated profile " + i;
+                updated.accountstate = true;
+                updated.invitetimes = 10 + i;
+                int ret = db.UpdateInformation(updated);
+                Assertions.assertEquals(0, ret, "UpdateInformation should return 0 for success");
+                em.flush();
+                em.clear();
+                User after = em.find(User.class, userId);
+                Assertions.assertEquals("user_updated" + i, after.username);
+                Assertions.assertEquals("newpassword" + i, after.password);
+                Assertions.assertEquals("f", after.sex);
+                Assertions.assertEquals("MIT" + i, after.school);
+                Assertions.assertEquals("https://cdn.example.com/avatars/user_new" + i + ".jpg", after.pictureurl);
+                Assertions.assertEquals("Updated profile " + i, after.profile);
+                Assertions.assertTrue(after.accountstate);
+                Assertions.assertEquals(10 + i, after.invitetimes);
+                // 测试不存在用户
+                User notExist = new User();
+                notExist.userid = "not_exist_user_" + i;
+                notExist.email = "not_exist" + i + "@example.com";
+                notExist.username = "not_exist";
+                notExist.password = "not_exist";
+                notExist.sex = "m";
+                notExist.school = "not_exist";
+                notExist.pictureurl = null;
+                notExist.profile = null;
+                notExist.accountstate = false;
+                notExist.invitetimes = 0;
+                int ret2 = db.UpdateInformation(notExist);
+                Assertions.assertEquals(1, ret2, "UpdateInformation should return 1 for not found user");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetInformation() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("GetInformation test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个用户（补充userPT字段，避免not-null property异常）
+                User user = new User();
+                user.userid = testUserIds.get(i);
+                if (user.userid.length() > 36) user.userid = user.userid.substring(0, 36);
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = "pic" + i + ".jpg";
+                user.profile = "profile" + i;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.flush();
+                // 查询
+                User got = db.GetInformation(testUserIds.get(i));
+                Assertions.assertNotNull(got, "GetInformation should return user");
+                Assertions.assertEquals(user.userid, got.userid);
+                Assertions.assertEquals(user.email, got.email);
+                Assertions.assertEquals(user.username, got.username);
+                Assertions.assertEquals(user.password, got.password);
+                Assertions.assertEquals(user.sex, got.sex);
+                Assertions.assertEquals(user.school, got.school);
+                Assertions.assertEquals(user.pictureurl, got.pictureurl);
+                Assertions.assertEquals(user.profile, got.profile);
+                Assertions.assertEquals(user.accountstate, got.accountstate);
+                Assertions.assertEquals(user.invitetimes, got.invitetimes);
+                // 查询不存在用户
+                User notExist = db.GetInformation("not_exist_" + i);
+                Assertions.assertNull(notExist, "GetInformation should return null for not found user");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetInformationPT() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("GetInformationPT test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 同时插入UserPT，保证外键依赖
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 100 + i;
+                userPT.upload = 1000L + i;
+                userPT.download = 2000L + i;
+                userPT.share = 1.5 + i;
+                userPT.farmurl = "/data/seeds/" + userId;
+                userPT.viptime = 3 + i;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                // 查询
+                entity.UserPT got = db.GetInformationPT(userId);
+                Assertions.assertNotNull(got, "GetInformationPT should return UserPT");
+                Assertions.assertEquals(userId, got.userid);
+                Assertions.assertEquals(100 + i, got.magic);
+                Assertions.assertEquals(1000L + i, got.upload);
+                Assertions.assertEquals(2000L + i, got.download);
+                Assertions.assertEquals(1.5 + i, got.share);
+                Assertions.assertEquals("/data/seeds/" + userId, got.farmurl);
+                Assertions.assertEquals(3 + i, got.viptime);
+                // 查询不存在用户
+                entity.UserPT notExist = db.GetInformationPT("not_exist_user_" + i);
+                Assertions.assertNull(notExist, "GetInformationPT should return null for not found user");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testUpdateInformationPT() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("UpdateInformationPT test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User
+                User user = new User();
+                String userId = testUserIds.get(i);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 自动补齐userPT，避免not-null property异常
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                // 修改信息
+                entity.UserPT updated = new entity.UserPT();
+                updated.userid = userId;
+                updated.magic = 200 + i;
+                updated.upload = 3000L + i;
+                updated.download = 4000L + i;
+                updated.share = 2.5 + i;
+                updated.farmurl = "/new/path/seed" + i;
+                updated.viptime = 8 + i;
+                int ret = db.UpdateInformationPT(updated);
+                Assertions.assertEquals(0, ret, "UpdateInformationPT should return 0 for success");
+                em.flush();
+                em.clear();
+                entity.UserPT after = em.find(entity.UserPT.class, userId);
+                Assertions.assertEquals(200 + i, after.magic);
+                Assertions.assertEquals(3000L + i, after.upload);
+                Assertions.assertEquals(4000L + i, after.download);
+                Assertions.assertEquals(2.5 + i, after.share);
+                Assertions.assertEquals("/new/path/seed" + i, after.farmurl);
+                Assertions.assertEquals(8 + i, after.viptime);
+                // 测试不存在用户
+                entity.UserPT notExist = new entity.UserPT();
+                notExist.userid = "not_exist_" + i;
+                notExist.magic = 0;
+                notExist.upload = 0L;
+                notExist.download = 0L;
+                notExist.share = 0.0;
+                notExist.farmurl = null;
+                notExist.viptime = 0;
+                int ret2 = db.UpdateInformationPT(notExist);
+                Assertions.assertEquals(1, ret2, "UpdateInformationPT should return 1 for not found user");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testRegisterUserPT() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("RegisterUserPT test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User，保证UserPT外键约束
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 自动补齐userPT，避免not-null property异常
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 100 + i;
+                userPT.upload = 1000L + i;
+                userPT.download = 2000L + i;
+                userPT.share = 1.5;
+                userPT.farmurl = "/path/to/seed" + i;
+                userPT.viptime = 3 + i;
+                userPT.user = user;
+                user.userPT = userPT;
+                // em.persist(user);
+                // em.persist(userPT);
+                // em.flush();
+                // 正常注册
+                int ret = db.RegisterUserPT(userPT);
+                Assertions.assertEquals(0, ret, "RegisterUserPT should return 0 for success");
+                // 再次注册同ID应返回1
+                entity.UserPT userPT2 = new entity.UserPT();
+                userPT2.userid = userId;
+                userPT2.magic = 200 + i;
+                userPT2.upload = 3000L + i;
+                userPT2.download = 4000L + i;
+                userPT2.share = 2.5;
+                userPT2.farmurl = "/other/path/seed" + i;
+                userPT2.viptime = 8 + i;
+                int ret2 = db.RegisterUserPT(userPT2);
+                Assertions.assertEquals(1, ret2, "RegisterUserPT should return 1 for duplicate id");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetSeedInformation() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("GetSeedInformation test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User，保证seed.seeduserid外键依赖
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 自动补齐userPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                // 再插入Seed
+                entity.Seed seed = new entity.Seed();
+                seed.seedid = "test_seed_" + i + "_" + UUID.randomUUID();
+                seed.seeduserid = userId;
+                seed.faketime = i;
+                seed.lastfakecheck = new java.util.Date();
+                seed.outurl = "http://example.com/seed" + i;
+                seed.title = "title" + i;
+                seed.subtitle = "subtitle" + i;
+                seed.seedsize = "100MB";
+                seed.seedtag = "tag" + i;
+                seed.downloadtimes = 10 + i;
+                seed.url = "http://download.com/seed" + i;
+                em.persist(seed);
+                em.flush();
+                // 查询
+                entity.Seed got = db.GetSeedInformation(seed.seedid);
+                Assertions.assertNotNull(got, "GetSeedInformation should return seed");
+                Assertions.assertEquals(seed.seedid, got.seedid);
+                Assertions.assertEquals(seed.seeduserid, got.seeduserid);
+                Assertions.assertEquals(seed.faketime, got.faketime);
+                Assertions.assertEquals(seed.outurl, got.outurl);
+                Assertions.assertEquals(seed.title, got.title);
+                Assertions.assertEquals(seed.subtitle, got.subtitle);
+                Assertions.assertEquals(seed.seedsize, got.seedsize);
+                Assertions.assertEquals(seed.seedtag, got.seedtag);
+                Assertions.assertEquals(seed.downloadtimes, got.downloadtimes);
+                Assertions.assertEquals(seed.url, got.url);
+                // 查询不存在种子
+                entity.Seed notExist = db.GetSeedInformation("not_exist_seed_" + i);
+                Assertions.assertNull(notExist, "GetSeedInformation should return null for not found seed");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testRegisterSeed() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("RegisterSeed test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User，保证seed.seeduserid外键依赖，且UserPT不为空
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 关键：补充userPT字段，避免not-null property异常
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                // 再插入Seed
+                entity.Seed seed = new entity.Seed();
+                String sid = ("test_seed_" + i + "_" + UUID.randomUUID());
+                if (sid.length() > 64) sid = sid.substring(0, 64);
+                seed.seedid = sid;
+                seed.seeduserid = userId;
+                seed.faketime = i;
+                seed.lastfakecheck = new java.util.Date();
+                seed.outurl = ("http://example.com/seed" + i);
+                if (seed.outurl != null && seed.outurl.length() > 255) seed.outurl = seed.outurl.substring(0, 255);
+                seed.title = ("title" + i);
+                if (seed.title.length() > 255) seed.title = seed.title.substring(0, 255);
+                seed.subtitle = ("subtitle" + i);
+                if (seed.subtitle != null && seed.subtitle.length() > 255) seed.subtitle = seed.subtitle.substring(0, 255);
+                seed.seedsize = "100MB";
+                if (seed.seedsize.length() > 50) seed.seedsize = seed.seedsize.substring(0, 50);
+                seed.seedtag = ("tag" + i);
+                if (seed.seedtag != null && seed.seedtag.length() > 255) seed.seedtag = seed.seedtag.substring(0, 255);
+                seed.downloadtimes = 10 + i;
+                seed.url = ("http://download.com/seed" + i);
+                em.persist(seed);
+                em.flush();
+                // 校验数据库中已存在
+                entity.Seed found = em.find(entity.Seed.class, seed.seedid);
+                Assertions.assertNotNull(found, "数据库应存在该种子");
+                Assertions.assertEquals(seed.seedid, found.seedid);
+                Assertions.assertEquals(seed.seeduserid, found.seeduserid);
+                Assertions.assertEquals(seed.faketime, found.faketime);
+                Assertions.assertEquals(seed.outurl, found.outurl);
+                Assertions.assertEquals(seed.title, found.title);
+                Assertions.assertEquals(seed.subtitle, found.subtitle);
+                Assertions.assertEquals(seed.seedsize, found.seedsize);
+                Assertions.assertEquals(seed.seedtag, found.seedtag);
+                Assertions.assertEquals(seed.downloadtimes, found.downloadtimes);
+                Assertions.assertEquals(seed.url, found.url);
+                // 再次注册同ID应返回1
+                entity.Seed seed2 = new entity.Seed();
+                seed2.seedid = sid;
+                seed2.seeduserid = userId;
+                seed2.faketime = 99;
+                seed2.lastfakecheck = new java.util.Date();
+                seed2.outurl = ("http://example.com/seed_dup" + i);
+                if (seed2.outurl != null && seed2.outurl.length() > 255) seed2.outurl = seed2.outurl.substring(0, 255);
+                seed2.title = ("title_dup" + i);
+                if (seed2.title.length() > 255) seed2.title = seed2.title.substring(0, 255);
+                seed2.subtitle = ("subtitle_dup" + i);
+                if (seed2.subtitle != null && seed2.subtitle.length() > 255) seed2.subtitle = seed2.subtitle.substring(0, 255);
+                seed2.seedsize = "200MB";
+                if (seed2.seedsize.length() > 50) seed2.seedsize = seed2.seedsize.substring(0, 50);
+                seed2.seedtag = ("tag_dup" + i);
+                if (seed2.seedtag != null && seed2.seedtag.length() > 255) seed2.seedtag = seed2.seedtag.substring(0, 255);
+                seed2.downloadtimes = 99;
+                seed2.url = ("http://download.com/seed_dup" + i);
+                int ret2 = db.RegisterSeed(seed2);
+                Assertions.assertEquals(1, ret2, "RegisterSeed should return 1 for duplicate id");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testUpdateSeed() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("UpdateSeed test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User，保证seed.seeduserid外键依赖，且UserPT不为空
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+                // 关键：补充userPT字段，避免not-null property异常
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                // 再插入Seed
+                entity.Seed seed = new entity.Seed();
+                String sid = ("test_seed_" + i + "_" + UUID.randomUUID());
+                if (sid.length() > 64) sid = sid.substring(0, 64);
+                seed.seedid = sid;
+                seed.seeduserid = userId;
+                seed.faketime = i;
+                seed.lastfakecheck = new java.util.Date();
+                seed.outurl = ("http://example.com/seed" + i);
+                if (seed.outurl != null && seed.outurl.length() > 255) seed.outurl = seed.outurl.substring(0, 255);
+                seed.title = ("title" + i);
+                if (seed.title.length() > 255) seed.title = seed.title.substring(0, 255);
+                seed.subtitle = ("subtitle" + i);
+                if (seed.subtitle != null && seed.subtitle.length() > 255) seed.subtitle = seed.subtitle.substring(0, 255);
+                seed.seedsize = "100MB";
+                if (seed.seedsize.length() > 50) seed.seedsize = seed.seedsize.substring(0, 50);
+                seed.seedtag = ("tag" + i);
+                if (seed.seedtag != null && seed.seedtag.length() > 255) seed.seedtag = seed.seedtag.substring(0, 255);
+                seed.downloadtimes = 10 + i;
+                seed.url = ("http://download.com/seed" + i);
+                em.persist(seed);
+                em.flush();
+                // 修改信息
+                entity.Seed updated = new entity.Seed();
+                updated.seedid = sid;
+                updated.seeduserid = userId + "_updated";
+                if (updated.seeduserid.length() > 36) updated.seeduserid = updated.seeduserid.substring(0, 36);
+                updated.faketime = 99;
+                updated.lastfakecheck = new java.util.Date();
+                updated.outurl = ("http://example.com/seed_updated" + i);
+                if (updated.outurl != null && updated.outurl.length() > 255) updated.outurl = updated.outurl.substring(0, 255);
+                updated.title = ("title_updated" + i);
+                if (updated.title.length() > 255) updated.title = updated.title.substring(0, 255);
+                updated.subtitle = ("subtitle_updated" + i);
+                if (updated.subtitle != null && updated.subtitle.length() > 255) updated.subtitle = updated.subtitle.substring(0, 255);
+                updated.seedsize = "200MB";
+                if (updated.seedsize.length() > 50) updated.seedsize = updated.seedsize.substring(0, 50);
+                updated.seedtag = ("tag_updated" + i);
+                if (updated.seedtag != null && updated.seedtag.length() > 255) updated.seedtag = updated.seedtag.substring(0, 255);
+                updated.downloadtimes = 99;
+                updated.url = ("http://download.com/seed_updated" + i);
+                int ret = db.UpdateSeed(updated);
+                Assertions.assertEquals(0, ret, "UpdateSeed should return 0 for success");
+                em.flush();
+                em.clear();
+                entity.Seed after = em.find(entity.Seed.class, sid);
+                Assertions.assertEquals(updated.seeduserid, after.seeduserid);
+                Assertions.assertEquals(99, after.faketime);
+                Assertions.assertEquals(updated.outurl, after.outurl);
+                Assertions.assertEquals(updated.title, after.title);
+                Assertions.assertEquals(updated.subtitle, after.subtitle);
+                Assertions.assertEquals(updated.seedsize, after.seedsize);
+                Assertions.assertEquals(updated.seedtag, after.seedtag);
+                Assertions.assertEquals(99, after.downloadtimes);
+                Assertions.assertEquals(updated.url, after.url);
+                // 测试不存在种子
+                entity.Seed notExist = new entity.Seed();
+                notExist.seedid = "not_exist_seed_" + i;
+                if (notExist.seedid.length() > 64) notExist.seedid = notExist.seedid.substring(0, 64);
+                notExist.seeduserid = "owner_x";
+                if (notExist.seeduserid.length() > 36) notExist.seeduserid = notExist.seeduserid.substring(0, 36);
+                notExist.faketime = 0;
+                notExist.lastfakecheck = new java.util.Date();
+                notExist.outurl = null;
+                notExist.title = "not_exist";
+                if (notExist.title.length() > 255) notExist.title = notExist.title.substring(0, 255);
+                notExist.subtitle = null;
+                notExist.seedsize = "0MB";
+                if (notExist.seedsize.length() > 50) notExist.seedsize = notExist.seedsize.substring(0, 50);
+                notExist.seedtag = null;
+                notExist.downloadtimes = 0;
+                notExist.url = null;
+                int ret2 = db.UpdateSeed(notExist);
+                Assertions.assertEquals(1, ret2, "UpdateSeed should return 1 for not found seed");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testSearchSeed() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("SearchSeed test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入User，保证seed.seeduserid外键依赖
+                User user = new User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = testEmails.get(i);
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = null;
+                user.profile = null;
+                user.accountstate = false;
+                user.invitetimes = 5;
+    
+                // 插入UserPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = userId;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                // 插入多条Seed
+                List<entity.Seed> seeds = new ArrayList<>();
+                for (int j = 0; j < 5; j++) {
+                    entity.Seed seed = new entity.Seed();
+                    seed.seedid = "search_seed_" + i + "_" + j + "_" + UUID.randomUUID();
+                    seed.seeduserid = userId;
+                    seed.faketime = j;
+                    seed.lastfakecheck = new java.util.Date();
+                    seed.outurl = "http://example.com/seed" + j;
+                    seed.title = "TestTitle" + i + (j % 2 == 0 ? "_Special" : "") + "_" + j;
+                    seed.subtitle = "subtitle" + j;
+                    seed.seedsize = "100MB";
+                    seed.seedtag = "tag" + j;
+                    seed.downloadtimes = 10 + j;
+                    seed.url = "http://download.com/seed" + j;
+                    em.persist(seed);
+                    seeds.add(seed);
+                }
+                em.flush();
+                // 测试关键词能搜到相关种子
+                String keyword = "Special";
+                entity.Seed[] result = db.SearchSeed(keyword);
+                boolean found = false;
+                for (entity.Seed s : result) {
+                    if (s.title.contains(keyword)) found = true;
+                }
+                Assertions.assertTrue(found, "SearchSeed should find seeds with keyword in title");
+                // 测试空字符串返回所有种子
+                entity.Seed[] all = db.SearchSeed("");
+                Assertions.assertEquals(seeds.size() + 5, all.length, "SearchSeed with empty string should return all");
+                // 测试无匹配关键词
+                entity.Seed[] none = db.SearchSeed("NoSuchKeyword" + i);
+                Assertions.assertEquals(seeds.size() + 5, none.length, "SearchSeed with no match should return all, sorted");
+                // 测试null关键词
+                entity.Seed[] nullResult = db.SearchSeed(null);
+                Assertions.assertEquals(seeds.size() + 5, nullResult.length, "SearchSeed with null should return all");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddNotice() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("AddNotice test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 构造 Notice
+                entity.Notice notice = new entity.Notice();
+                notice.noticeid = "test_notice_" + i + "_" + UUID.randomUUID();
+                notice.noticecontent = "内容" + i;
+                notice.state = (i % 2 == 0);
+                notice.posttag = "tag" + i;
+                // 正常插入
+                int ret = db.AddNotice(notice);
+                Assertions.assertEquals(0, ret, "AddNotice 应返回0");
+                // 再次插入同ID应返回1
+                entity.Notice notice2 = new entity.Notice();
+                notice2.noticeid = notice.noticeid;
+                notice2.noticecontent = "内容重复" + i;
+                notice2.state = false;
+                notice2.posttag = "tag_dup" + i;
+                int ret2 = db.AddNotice(notice2);
+                Assertions.assertEquals(1, ret2, "AddNotice 应返回1（重复ID）");
+                // 校验数据库中已存在
+                entity.Notice found = em.find(entity.Notice.class, notice.noticeid);
+                Assertions.assertNotNull(found, "数据库应存在该公告");
+                Assertions.assertEquals(notice.noticecontent, found.noticecontent);
+                Assertions.assertEquals(notice.state, found.state);
+                Assertions.assertEquals(notice.posttag, found.posttag);
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testUpdateNotice() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("UpdateNotice test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个Notice
+                entity.Notice notice = new entity.Notice();
+                notice.noticeid = "test_notice_update_" + i + "_" + UUID.randomUUID();
+                notice.noticecontent = "原内容" + i;
+                notice.state = true;
+                notice.posttag = "tag" + i;
+                em.persist(notice);
+                em.flush();
+                // 修改内容
+                entity.Notice updated = new entity.Notice();
+                updated.noticeid = notice.noticeid;
+                updated.noticecontent = "新内容" + i;
+                updated.state = false;
+                updated.posttag = "tag_updated" + i;
+                boolean ret = db.UpdateNotice(updated);
+                Assertions.assertTrue(ret, "UpdateNotice 应返回 true");
+                em.flush();
+                em.clear();
+                entity.Notice after = em.find(entity.Notice.class, notice.noticeid);
+                Assertions.assertEquals("新内容" + i, after.noticecontent);
+                Assertions.assertFalse(after.state);
+                Assertions.assertEquals("tag_updated" + i, after.posttag);
+                // 测试不存在公告
+                entity.Notice notExist = new entity.Notice();
+                notExist.noticeid = "not_exist_notice_" + i;
+                notExist.noticecontent = "xxx";
+                notExist.state = false;
+                notExist.posttag = "none";
+                boolean ret2 = db.UpdateNotice(notExist);
+                Assertions.assertFalse(ret2, "UpdateNotice 应返回 false for not found");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testDeleteNotice() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("DeleteNotice test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个Notice
+                entity.Notice notice = new entity.Notice();
+                notice.noticeid = "test_notice_delete_" + i + "_" + UUID.randomUUID();
+                notice.noticecontent = "内容" + i;
+                notice.state = true;
+                notice.posttag = "tag" + i;
+                em.persist(notice);
+                em.flush();
+                // 删除
+                boolean ret = db.DeleteNotice(notice.noticeid);
+                Assertions.assertTrue(ret, "DeleteNotice 应返回 true");
+                em.flush();
+                em.clear();
+                entity.Notice after = em.find(entity.Notice.class, notice.noticeid);
+                Assertions.assertNull(after, "DeleteNotice 后应查不到公告");
+                // 删除不存在的公告
+                boolean ret2 = db.DeleteNotice("not_exist_notice_" + i);
+                Assertions.assertFalse(ret2, "DeleteNotice 应返回 false for not found");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetUserAvailableInviteTimes() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("GetUserAvailableInviteTimes test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个User
+                entity.User user = new entity.User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = "invite" + i + "@example.com";
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = "pic" + i + ".jpg";
+                user.profile = "profile" + i;
+                user.accountstate = true;
+                user.invitetimes = 5 + i;
+                
+                // 插入UserPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                // 查询
+                int left = db.GetUserAvailableInviteTimes(user.userid);
+                Assertions.assertEquals(5 + i, left, "GetUserAvailableInviteTimes 应返回正确剩余次数");
+                // 查询不存在用户
+                int notExist = db.GetUserAvailableInviteTimes("not_exist_user_" + i);
+                Assertions.assertEquals(-1, notExist, "GetUserAvailableInviteTimes 不存在用户应返回-1");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testInviteUser() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("InviteUser test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 先插入一个User
+                entity.User user = new entity.User();
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+                user.userid = userId;
+                user.email = "invite" + i + "@example.com";
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = "pic" + i + ".jpg";
+                user.profile = "profile" + i;
+                user.accountstate = true;
+                user.invitetimes = 3 + i;
+                
+                // 插入UserPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                // 正常邀请
+                int ret = db.InviteUser(user.userid, user.email);
+                Assertions.assertEquals(0, ret, "InviteUser 应返回0");
+                em.flush();
+                em.clear();
+                entity.User after = em.find(entity.User.class, user.userid);
+                Assertions.assertEquals(2 + i, after.invitetimes, "邀请后次数应减少1");
+                // 剩余次数不足
+                after.invitetimes = 0;
+                em.merge(after);
+                em.flush();
+                int ret2 = db.InviteUser(user.userid, user.email);
+                Assertions.assertEquals(1, ret2, "InviteUser 剩余次数不足应返回1");
+                // 邮箱不匹配
+                int ret3 = db.InviteUser(user.userid, "wrong" + i + "@example.com");
+                Assertions.assertEquals(3, ret3, "InviteUser 邮箱不匹配应返回3");
+                // 用户不存在
+                int ret4 = db.InviteUser("not_exist_user_" + i, "invite" + i + "@example.com");
+                Assertions.assertEquals(3, ret4, "InviteUser 用户不存在应返回3");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testAddCollect() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("AddCollect test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 构造用户和种子
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+
+                entity.User user = new entity.User();
+                user.userid = userId;
+                user.email = "invite" + i + "@example.com";
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = "pic" + i + ".jpg";
+                user.profile = "profile" + i;
+                user.accountstate = true;
+                user.invitetimes = 5 + i;
+                // 插入UserPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                entity.Seed seed = new entity.Seed();
+                String seedid = "test_seed_collect_" + i + "_" + UUID.randomUUID();
+                seed.seedid = seedid;
+                seed.seeduserid = userId;
+                seed.faketime = i;
+                seed.lastfakecheck = new java.util.Date();
+                seed.outurl = "http://example.com/seed" + i;
+                seed.title = "title" + i;
+                seed.subtitle = "subtitle" + i;
+                seed.seedsize = "100MB";
+                seed.seedtag = "tag" + i;
+                seed.downloadtimes = 10 + i;
+                seed.url = "http://download.com/seed" + i;
+                em.persist(seed);
+                em.flush();
+                // 正常收藏
+                boolean ret = db.AddCollect(userId, seedid);
+                Assertions.assertTrue(ret, "AddCollect 应返回 true");
+                em.flush();
+                em.clear();
+                entity.UserStar found = em.find(entity.UserStar.class, new entity.UserStarId(userId, seedid));
+                Assertions.assertNotNull(found, "收藏应已存在");
+                // 重复收藏
+                boolean ret2 = db.AddCollect(userId, seedid);
+                Assertions.assertFalse(ret2, "AddCollect 重复应返回 false");
+                // 用户不存在
+                boolean ret3 = db.AddCollect("not_exist_user_" + i, seedid);
+                Assertions.assertFalse(ret3, "AddCollect 用户不存在应返回 false");
+                // 帖子不存在
+                boolean ret4 = db.AddCollect(userId, "not_exist_post_" + i);
+                Assertions.assertFalse(ret4, "AddCollect 帖子不存在应返回 false");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testDeleteCollect() {
+        return IntStream.range(0, 10).mapToObj(i -> DynamicTest.dynamicTest("DeleteCollect test #" + i, () -> {
+            EntityTransaction tx = em.getTransaction();
+            tx.begin();
+            try {
+                // 构造用户和种子
+                String userId = testUserIds.get(i);
+                if (userId.length() > 36) userId = userId.substring(0, 36);
+
+                entity.User user = new entity.User();
+                user.userid = userId;
+                user.email = "invite" + i + "@example.com";
+                user.username = "user" + i;
+                user.password = "pwd" + i;
+                user.sex = "m";
+                user.school = "school" + i;
+                user.pictureurl = "pic" + i + ".jpg";
+                user.profile = "profile" + i;
+                user.accountstate = true;
+                user.invitetimes = 5 + i;
+                // 插入UserPT，保证UserPT不为空
+                entity.UserPT userPT = new entity.UserPT();
+                userPT.userid = user.userid;
+                userPT.magic = 0;
+                userPT.upload = 0L;
+                userPT.download = 0L;
+                userPT.share = 0.0;
+                userPT.farmurl = null;
+                userPT.viptime = 0;
+                userPT.user = user;
+                user.userPT = userPT;
+                em.persist(user);
+                em.persist(userPT);
+                em.flush();
+                entity.Seed seed = new entity.Seed();
+                String seedid = "test_seed_collect_" + i + "_" + UUID.randomUUID();
+                seed.seedid = seedid;
+                seed.seeduserid = userId;
+                seed.faketime = i;
+                seed.lastfakecheck = new java.util.Date();
+                seed.outurl = "http://example.com/seed" + i;
+                seed.title = "title" + i;
+                seed.subtitle = "subtitle" + i;
+                seed.seedsize = "100MB";
+                seed.seedtag = "tag" + i;
+                seed.downloadtimes = 10 + i;
+                seed.url = "http://download.com/seed" + i;
+                em.persist(seed);
+                em.flush();
+                // 先收藏
+                entity.UserStar star = new entity.UserStar();
+                star.userid = userId;
+                star.seedid = seedid;
+                em.persist(star);
+                em.flush();
+                // 正常删除
+                boolean ret = db.DeleteCollect(userId, seedid);
+                Assertions.assertTrue(ret, "DeleteCollect 应返回 true");
+                em.flush();
+                em.clear();
+                entity.UserStar found = em.find(entity.UserStar.class, new entity.UserStarId(userId, seedid));
+                Assertions.assertNull(found, "删除后收藏应不存在");
+                // 删除不存在的收藏
+                boolean ret2 = db.DeleteCollect(userId, seedid);
+                Assertions.assertTrue(ret2, "再次删除应返回 true（JPA remove null容忍）");
+                // 用户不存在
+                boolean ret3 = db.DeleteCollect("not_exist_user_" + i, seedid);
+                Assertions.assertTrue(ret3, "用户不存在时应返回 true（JPA remove null容忍）");
+                // 帖子不存在
+                boolean ret4 = db.DeleteCollect(userId, "not_exist_seed_" + i);
+                Assertions.assertTrue(ret4, "帖子不存在时应返回 true（JPA remove null容忍）");
+            } finally {
+                tx.rollback();
+            }
+        })).collect(Collectors.toList());
+    }
+}
\ No newline at end of file
