diff --git a/src/main/java/database/Database2.java b/src/main/java/database/Database2.java
index 0166081..91dc8ff 100644
--- a/src/main/java/database/Database2.java
+++ b/src/main/java/database/Database2.java
@@ -3,9 +3,11 @@
 import java.util.Calendar;
 import java.util.UUID;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 import java.util.Date;
 import java.util.HashMap;
+import java.io.File;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
@@ -25,9 +27,13 @@
 import entity.config;
 import entity.Notice;
 import entity.BegInfo;
+import entity.BegInfoDetail;
+import entity.BegSeedDetail;
 import entity.Post;
 import entity.PostReply;
 import entity.Profile;
+import entity.UserStar;
+import entity.SeedWithVotes;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -1121,4 +1127,108 @@
     public Post[] SearchPost(String userQ) {
         return null;
     }
+
+    @Override
+    public int CheckAdmin(String userid) {
+        return 0;
+    }
+
+    @Override
+    public int InviteNewUser(String inviterid, String invitedemail) {
+        return 0;
+    }
+
+    @Override
+    public UserStar[] GetUserStarList(String userid) {
+        return new UserStar[0];
+    }
+
+    @Override
+    public int UploadMigration(String userid, File file){
+        return 0;
+    }
+
+    @Override
+    public BegSeedDetail[] GetBegList() {
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            JPAQuery<BegInfo> query = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            List<BegInfo> begList = query.select(b).from(b).fetch();
+            
+            List<BegSeedDetail> begSeedDetailList = new ArrayList<>();
+            for (BegInfo begInfo : begList) {
+                // 查询对应的BegInfo表的Info字段
+                BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begInfo.begid);
+                // 构造BegSeedDetail对象
+                BegSeedDetail begSeedDetail = new BegSeedDetail(begInfo, begInfoDetail);
+                begSeedDetailList.add(begSeedDetail);
+            }
+            
+            return begSeedDetailList.toArray(new BegSeedDetail[0]);
+        } catch (Exception e) {
+            logger.error("Error getting BegList: {}", e.getMessage(), e);
+            return new BegSeedDetail[0];
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public BegInfo GetBegDetail(String begid) {
+        return null;
+    }
+
+    @Override
+    public BegSeedDetail GetBegSeedDetail(String begid) {
+        if (begid == null || begid.isEmpty()) {
+            return null;
+        }
+
+        EntityManager em = null;
+        try {
+            em = emf.createEntityManager();
+            
+            // 查询 BegSeed 表数据
+            JPAQuery<BegInfo> begQuery = new JPAQuery<>(em);
+            QBegInfo b = QBegInfo.begInfo;
+            BegInfo begInfo = begQuery.select(b).from(b).where(b.begid.eq(begid)).fetchOne();
+            
+            if (begInfo == null) {
+                return null;
+            }
+
+            // 查询 BegInfo 表的 Info 字段
+            BegInfoDetail begInfoDetail = em.find(BegInfoDetail.class, begid);
+            
+            // 构造返回对象
+            return new BegSeedDetail(begInfo, begInfoDetail);
+        } catch (Exception e) {
+            logger.error("Error getting BegSeedDetail: {}", e.getMessage(), e);
+            return null;
+        } finally {
+            if (em != null) {
+                em.close();
+            }
+        }
+    }
+
+    @Override
+    public SeedWithVotes[] GetBegSeedListWithVotes(String begid) {
+        return new SeedWithVotes[0];
+    }
+
+    @Override
+    public int SubmitBegSeed(String begid, String seedid, String userid) {
+        return 0;
+    }
+
+    @Override
+    public int createBagSeed(BegInfo begInfo, String userid, String info) {
+        return 0;
+    }
 }
\ No newline at end of file
