绑定表

Change-Id: I9b381569457d242d1bd37bd8306e87d93eb0f640
diff --git a/pom.xml b/pom.xml
index 5e052ae..1590f5d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,31 @@
       <artifactId>commons-lang3</artifactId>
       <version>3.12.0</version>
     </dependency>
+    <dependency>
+      <groupId>javax.persistence</groupId>
+      <artifactId>javax.persistence-api</artifactId>
+      <version>2.2</version>
+    </dependency>
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-core</artifactId>
+      <version>5.6.14.Final</version>
+    </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>8.0.32</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.36</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>1.7.36</version>
+    </dependency>
   </dependencies>
 
   <!-- 构建配置 -->
diff --git a/src/main/java/object/Appeal.java b/src/main/java/object/Appeal.java
index 3df37e8..5057179 100644
--- a/src/main/java/object/Appeal.java
+++ b/src/main/java/object/Appeal.java
@@ -1,9 +1,35 @@
 package object;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Appeal")
 public class Appeal {
+    @Id
+    @Column(name = "appeal_id", length = 64, nullable = false)
     public String appealid;
+
+    @Column(name = "user_id", length = 36, nullable = false)
     public String appealuserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_appeal_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Lob
+    @Column(name = "content", nullable = false)
     public String content;
+
+    @Column(name = "file_url", length = 255)
     public String fileURL;
+
+    @Column(name = "status", nullable = false)
     public int state; // 0: pending, 1: approved, 2: rejected
 }
diff --git a/src/main/java/object/BegInfo.java b/src/main/java/object/BegInfo.java
index 1ac6bf5..4c3589a 100644
--- a/src/main/java/object/BegInfo.java
+++ b/src/main/java/object/BegInfo.java
@@ -1,9 +1,31 @@
 package object;
 
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "BegSeed")
 public class BegInfo {
+    @Id
+    @Column(name = "beg_id", length = 64, nullable = false)
     public String begid;
+
+    @Column(name = "beg_count", nullable = false)
     public int begnumbers;
+
+    @Column(name = "reward_magic", nullable = false)
     public int magic;
-    public String endtime;
+
+    @Column(name = "deadline", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date endtime;
+
+    @Column(name = "has_match", nullable = false)
     public boolean hasseed;
 }
diff --git a/src/main/java/object/Notice.java b/src/main/java/object/Notice.java
index 244eee1..a0b2b11 100644
--- a/src/main/java/object/Notice.java
+++ b/src/main/java/object/Notice.java
@@ -1,8 +1,25 @@
 package object;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Announcement")
 public class Notice {
+    @Id
+    @Column(name = "announce_id", length = 64, nullable = false)
     public String noticeid;
+
+    @Lob
+    @Column(name = "content", nullable = false)
     public String noticecontent;
+
+    @Column(name = "is_public", nullable = false)
     public boolean state;
+
+    @Column(name = "tag", length = 100)
     public String posttag;
 }
diff --git a/src/main/java/object/Post.java b/src/main/java/object/Post.java
index 84f9757..463e242 100644
--- a/src/main/java/object/Post.java
+++ b/src/main/java/object/Post.java
@@ -1,11 +1,46 @@
 package object;
 
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.Lob;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "Post")
 public class Post {
+    @Id
+    @Column(name = "post_id", length = 64, nullable = false)
     public String postid;
+
+    @Column(name = "title", length = 255, nullable = false)
     public String posttitle;
+
+    @Lob
+    @Column(name = "content", nullable = false)
     public String postcontent;
+
+    @Column(name = "author_id", length = 36, nullable = false)
     public String postuserid;
-    public String posttime;
-    public String replytime;
-    public String readtime;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "author_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_post_user"), insertable = false, updatable = false)
+    public User author;
+
+    @Column(name = "created_at", nullable = false)
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date posttime;
+
+    @Column(name = "reply_count", nullable = false)
+    public int replytime;
+
+    @Column(name = "view_count", nullable = false)
+    public int readtime;
 }
diff --git a/src/main/java/object/Profile.java b/src/main/java/object/Profile.java
index a33e7cd..c8469a9 100644
--- a/src/main/java/object/Profile.java
+++ b/src/main/java/object/Profile.java
@@ -1,13 +1,46 @@
 package object;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+@Entity
+@Table(name = "UserMigration")
 public class Profile {//迁移信息
+    @Id
+    @Column(name = "migration_id", length = 64, nullable = false)
     public String profileurl;
+
+    @Column(name = "user_id", length = 36, nullable = false)
     public String userid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_um_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Column(name = "approved", nullable = false)
     public boolean exampass;
+
+    @Column(name = "pending_magic", nullable = false)
     public String magictogive;
+
+    @Column(name = "pending_uploaded", nullable = false)
     public String uploadtogive;
+
+    @Transient
     public String downloadtogive;
+
+    @Column(name = "granted_magic", nullable = false)
     public String magicgived;
+
+    @Column(name = "granted_uploaded", nullable = false)
     public String uploadgived;
+
+    @Transient
     public String downloadgived;
 }
diff --git a/src/main/java/object/Seed.java b/src/main/java/object/Seed.java
index b353f46..b4f4c16 100644
--- a/src/main/java/object/Seed.java
+++ b/src/main/java/object/Seed.java
@@ -1,13 +1,53 @@
 package object;
 
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity
+@Table(name = "Seed")
 public class Seed {
+    @Id
+    @Column(name = "seed_id", length = 64, nullable = false)
     public String seedid;
+
+    @Column(name = "owner_user_id", length = 36, nullable = false)
     public String seeduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "owner_user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_seed_user"), insertable = false, updatable = false)
+    public User user;
+
+    @Column(name = "fake_hits", nullable = false)
     public int faketime;
+
+    @Column(name = "last_fake_check")
+    @Temporal(TemporalType.TIMESTAMP)
+    public Date lastfakecheck;
+
+    @Column(name = "external_url")
     public String outurl;
+
+    @Column(name = "title", length = 255, nullable = false)
     public String title;
+
+    @Column(name = "subtitle", length = 255)
     public String subtitle;
+
+    @Column(name = "size", length = 50, nullable = false)
     public String seedsize;
+
+    @Column(name = "tags")
     public String seedtag;
+
+    @Column(name = "popularity", nullable = false)
     public int downloadtimes;
 }
diff --git a/src/main/java/object/TransRecord.java b/src/main/java/object/TransRecord.java
index e32dce2..7f1c800 100644
--- a/src/main/java/object/TransRecord.java
+++ b/src/main/java/object/TransRecord.java
@@ -1,12 +1,54 @@
 package object;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "Transport")
+@IdClass(TransportId.class)
 public class TransRecord{
+    @Id
+    @Column(name = "task_id", length = 64, nullable = false)
     public String taskid;
+
+    @Id
+    @Column(name = "uploader_id", length = 36, nullable = false)
     public String uploaduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "uploader_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_tr_user_up"), insertable = false, updatable = false)
+    public User uploader;
+
+    @Id
+    @Column(name = "downloader_id", length = 36, nullable = false)
     public String downloaduserid;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "downloader_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_tr_user_down"), insertable = false, updatable = false)
+    public User downloader;
+
+    @Column(name = "seed_id", length = 64, nullable = false)
     public String seedid;
-    public int upload;
-    public int download;
-    public int maxupload;
-    public int maxdownload;
+
+    @ManyToOne(optional = false)
+    @JoinColumn(name = "seed_id", referencedColumnName = "seed_id", foreignKey = @ForeignKey(name = "fk_tr_seed"), insertable = false, updatable = false)
+    public Seed seed;
+
+    @Column(name = "uploaded", nullable = false)
+    public long upload;
+
+    @Column(name = "downloaded", nullable = false)
+    public long download;
+
+    @Column(name = "upload_peak", nullable = false)
+    public long maxupload;
+
+    @Column(name = "download_peak", nullable = false)
+    public long maxdownload;
 }
\ No newline at end of file
diff --git a/src/main/java/object/TransportId.java b/src/main/java/object/TransportId.java
new file mode 100644
index 0000000..8e102d3
--- /dev/null
+++ b/src/main/java/object/TransportId.java
@@ -0,0 +1,38 @@
+package object;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class TransportId implements Serializable {
+    private String taskid;
+    private String uploaduserid;
+    private String downloaduserid;
+
+    public TransportId() {}
+
+    public TransportId(String taskid, String uploaduserid, String downloaduserid) {
+        this.taskid = taskid;
+        this.uploaduserid = uploaduserid;
+        this.downloaduserid = downloaduserid;
+    }
+
+    public String getTaskid() { return taskid; }
+    public void setTaskid(String taskid) { this.taskid = taskid; }
+    public String getUploaduserid() { return uploaduserid; }
+    public void setUploaduserid(String uploaduserid) { this.uploaduserid = uploaduserid; }
+    public String getDownloaduserid() { return downloaduserid; }
+    public void setDownloaduserid(String downloaduserid) { this.downloaduserid = downloaduserid; }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TransportId that = (TransportId) o;
+        return Objects.equals(taskid, that.taskid) && Objects.equals(uploaduserid, that.uploaduserid) && Objects.equals(downloaduserid, that.downloaduserid);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(taskid, uploaduserid, downloaduserid);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/object/User.java b/src/main/java/object/User.java
index b9d72a1..5e8dfaa 100644
--- a/src/main/java/object/User.java
+++ b/src/main/java/object/User.java
@@ -1,15 +1,43 @@
 package object;
 
+import javax.persistence.*;
+
+@Entity
+@Table(name = "User", uniqueConstraints = @UniqueConstraint(name = "uniq_email", columnNames = {"email"}))
+@IdClass(UserId.class)
 public class User {
+    @Id
+    @Column(name = "user_id", length = 36, nullable = false)
     public String userid;
+
+    @Column(name = "username", length = 100, nullable = false)
     public String username;
+
+    @Column(name = "password", length = 255, nullable = false)
     public String password;
+
+    @Column(name = "gender", nullable = false)
     public String sex;
+
+    @Transient
     public String age;
+
+    @Id
+    @Column(name = "email", length = 255, nullable = false)
     public String email;
+
+    @Column(name = "school")
     public String school;
+
+    @Column(name = "avatar_url")
     public String pictureurl;
+
+    @Column(name = "bio")
     public String profile;
+
+    @Column(name = "account_status", nullable = false)
     public boolean accountstate;
+
+    @Column(name = "invite_left", nullable = false)
     public int invitetimes;
 }
diff --git a/src/main/java/object/UserId.java b/src/main/java/object/UserId.java
new file mode 100644
index 0000000..c68ce68
--- /dev/null
+++ b/src/main/java/object/UserId.java
@@ -0,0 +1,36 @@
+package object;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+public class UserId implements Serializable {
+    private String userid;
+    private String email;
+
+    public UserId() {}
+
+    public UserId(String userid, String email) {
+        this.userid = userid;
+        this.email = email;
+    }
+
+    // getters and setters
+    public String getUserid() { return userid; }
+    public void setUserid(String userid) { this.userid = userid; }
+
+    public String getEmail() { return email; }
+    public void setEmail(String email) { this.email = email; }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        UserId userId = (UserId) o;
+        return Objects.equals(userid, userId.userid) && Objects.equals(email, userId.email);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(userid, email);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/object/UserPT.java b/src/main/java/object/UserPT.java
index 0332640..db3703f 100644
--- a/src/main/java/object/UserPT.java
+++ b/src/main/java/object/UserPT.java
@@ -1,11 +1,41 @@
 package object;
 
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.ForeignKey;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.MapsId;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "UserPT")
 public class UserPT {
+    @Id
+    @Column(name = "user_id", length = 36, nullable = false)
     public String userid;
+
+    @OneToOne(optional = false)
+    @MapsId
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", foreignKey = @ForeignKey(name = "fk_pt_user"))
+    public User user;
+
+    @Column(name = "magic", nullable = false)
     public int magic;
-    public int upload;
-    public int download;
+
+    @Column(name = "uploaded", nullable = false)
+    public long upload;
+
+    @Column(name = "downloaded", nullable = false)
+    public long download;
+
+    @Column(name = "ratio", nullable = false, precision = 5, scale = 2)
     public double share;
+
+    @Column(name = "default_seed_path")
     public String farmurl;
-    public String viptime;
+
+    @Column(name = "vip_downloads", nullable = false)
+    public int viptime;
 }