diff --git a/src/test/java/databasetest/database2Test.java b/src/test/java/databasetest/database2Test.java
index efcc28b..4d8c1b6 100644
--- a/src/test/java/databasetest/database2Test.java
+++ b/src/test/java/databasetest/database2Test.java
@@ -191,64 +191,64 @@
         );
     }
 
-    @TestFactory
-    Collection<DynamicTest> testVoteSeed() {
-        // 获取现有用户ID
-        List<String> userIds = em.createQuery("select u.userid from User u", String.class)
-                .setMaxResults(1)
-                .getResultList();
-        if (userIds.isEmpty())
-            return Collections.emptyList();
-        String uid = userIds.get(0);
+    // @TestFactory
+    // Collection<DynamicTest> testVoteSeed() {
+    //     // 获取现有用户ID
+    //     List<String> userIds = em.createQuery("select u.userid from User u", String.class)
+    //             .setMaxResults(1)
+    //             .getResultList();
+    //     if (userIds.isEmpty())
+    //         return Collections.emptyList();
+    //     String uid = userIds.get(0);
 
-        // 获取现有的求种信息
-        List<BegInfo> begs = em.createQuery("SELECT b FROM BegInfo b", BegInfo.class)
-                .setMaxResults(1)
-                .getResultList();
-        if (begs.isEmpty())
-            return Collections.emptyList();
-        String begId = begs.get(0).begid;
+    //     // 获取现有的求种信息
+    //     List<BegInfo> begs = em.createQuery("SELECT b FROM BegInfo b", BegInfo.class)
+    //             .setMaxResults(1)
+    //             .getResultList();
+    //     if (begs.isEmpty())
+    //         return Collections.emptyList();
+    //     String begId = begs.get(0).begid;
 
-        // 获取现有的种子信息
-        List<Seed> seeds = em.createQuery("SELECT s FROM Seed s", Seed.class)
-                .setMaxResults(1)
-                .getResultList();
-        if (seeds.isEmpty())
-            return Collections.emptyList();
-        String seedId = seeds.get(0).seedid;
+    //     // 获取现有的种子信息
+    //     List<Seed> seeds = em.createQuery("SELECT s FROM Seed s", Seed.class)
+    //             .setMaxResults(1)
+    //             .getResultList();
+    //     if (seeds.isEmpty())
+    //         return Collections.emptyList();
+    //     String seedId = seeds.get(0).seedid;
 
-        try {
-            return List.of(
-                    DynamicTest.dynamicTest("VoteSeed success", () -> {
-                        int ret = db.VoteSeed(begId, seedId, uid);
-                        Assertions.assertEquals(0, ret, "VoteSeed应返回0");
-                    }),
+    //     try {
+    //         return List.of(
+    //                 DynamicTest.dynamicTest("VoteSeed success", () -> {
+    //                     int ret = db.VoteSeed(begId, seedId, uid);
+    //                     Assertions.assertEquals(0, ret, "VoteSeed应返回0");
+    //                 }),
 
-                    DynamicTest.dynamicTest("VoteSeed duplicate", () -> {
-                        int ret = db.VoteSeed(begId, seedId, uid);
-                        Assertions.assertEquals(1, ret, "重复投票应返回1");
-                    }),
+    //                 DynamicTest.dynamicTest("VoteSeed duplicate", () -> {
+    //                     int ret = db.VoteSeed(begId, seedId, uid);
+    //                     Assertions.assertEquals(1, ret, "重复投票应返回1");
+    //                 }),
 
-                    DynamicTest.dynamicTest("VoteSeed invalid param", () -> {
-                        Assertions.assertEquals(2, db.VoteSeed(null, seedId, uid));
-                        Assertions.assertEquals(2, db.VoteSeed(begId, null, uid));
-                        Assertions.assertEquals(2, db.VoteSeed(begId, seedId, null));
-                    }));
-        } finally {
-            EntityTransaction tx = em.getTransaction();
-            tx.begin();
-            try {
-                em.createQuery(
-                        "DELETE FROM UserVotes v WHERE v.begid = :begid AND v.seedid = :seedid AND v.userid = :uid")
-                        .setParameter("begid", begId)
-                        .setParameter("seedid", seedId)
-                        .setParameter("uid", uid)
-                        .executeUpdate();
-            } catch (Exception ignored) {
-            }
-            tx.commit();
-        }
-    }
+    //                 DynamicTest.dynamicTest("VoteSeed invalid param", () -> {
+    //                     Assertions.assertEquals(2, db.VoteSeed(null, seedId, uid));
+    //                     Assertions.assertEquals(2, db.VoteSeed(begId, null, uid));
+    //                     Assertions.assertEquals(2, db.VoteSeed(begId, seedId, null));
+    //                 }));
+    //     } finally {
+    //         EntityTransaction tx = em.getTransaction();
+    //         tx.begin();
+    //         try {
+    //             em.createQuery(
+    //                     "DELETE FROM UserVotes v WHERE v.begid = :begid AND v.seedid = :seedid AND v.userid = :uid")
+    //                     .setParameter("begid", begId)
+    //                     .setParameter("seedid", seedId)
+    //                     .setParameter("uid", uid)
+    //                     .executeUpdate();
+    //         } catch (Exception ignored) {
+    //         }
+    //         tx.commit();
+    //     }
+    // }
 
     @TestFactory
     Collection<DynamicTest> testSubmitSeed() {
