diff --git a/backend/src/main/java/hu/pazmany/Document.java b/backend/src/main/java/hu/pazmany/Document.java
new file mode 100644
index 0000000000000000000000000000000000000000..3cd372db0b903a5abcc48d2768a2ccd042cc59a2
--- /dev/null
+++ b/backend/src/main/java/hu/pazmany/Document.java
@@ -0,0 +1,98 @@
+package hu.pazmany;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.JoinColumn;
+import java.time.LocalDateTime;
+
+@Entity
+@Table(name = "DOCUMENTS")
+public class Document {
+    @Id
+    @Column(name = "id", unique = true, nullable = false)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne
+    @JoinColumn(name = "userId", nullable = false)
+    private hu.pazmany.User user;
+
+    @ManyToOne
+    @JoinColumn(name = "subjectId", nullable = false)
+    private Subject subject;
+
+    @Column(name = "title", nullable = false)
+    private String title;
+
+    @Column(name = "description")
+    private String description;
+
+    @Column(name = "uploaded")
+    private LocalDateTime uploaded;
+
+    @Column(name = "filepath", nullable = false)
+    private String filepath;
+
+    // Getters and setters
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public hu.pazmany.User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
+    public Subject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(Subject subject) {
+        this.subject = subject;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public LocalDateTime getUploaded() {
+        return uploaded;
+    }
+
+    public void setUploaded(LocalDateTime uploaded) {
+        this.uploaded = uploaded;
+    }
+
+    public String getFilepath() {
+        return filepath;
+    }
+
+    public void setFilepath(String filepath) {
+        this.filepath = filepath;
+    }
+}
diff --git a/backend/src/main/java/hu/pazmany/DocumentRepository.java b/backend/src/main/java/hu/pazmany/DocumentRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b97f475228efa0f374a561d1a93a13f1010421b
--- /dev/null
+++ b/backend/src/main/java/hu/pazmany/DocumentRepository.java
@@ -0,0 +1,9 @@
+package hu.pazmany;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
+
+public interface DocumentRepository extends JpaRepository<Document, Long>{
+    List<Document> findAllByUser(User user);
+    List<Document> findAllBySubject(Subject subject);
+}
diff --git a/backend/src/main/java/hu/pazmany/Subject.java b/backend/src/main/java/hu/pazmany/Subject.java
new file mode 100644
index 0000000000000000000000000000000000000000..c83cb0bce52a9d7281395a9749f7fe570f00bbc2
--- /dev/null
+++ b/backend/src/main/java/hu/pazmany/Subject.java
@@ -0,0 +1,35 @@
+package hu.pazmany;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
+
+@Entity
+@Table(name = "SUBJECTS")
+public class Subject {
+    @Id
+    @Column(name = "id", unique = true, nullable = false)
+    private String subjectId;
+
+    @Column(name = "name", nullable = false)
+    private String name;
+
+    // Getters and setters
+
+    public String getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(String subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/backend/src/main/java/hu/pazmany/SubjectRepository.java b/backend/src/main/java/hu/pazmany/SubjectRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..61197c43d0d6afb5d2f2ae1bf7d84b6c125ca4cf
--- /dev/null
+++ b/backend/src/main/java/hu/pazmany/SubjectRepository.java
@@ -0,0 +1,7 @@
+package hu.pazmany;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface SubjectRepository extends JpaRepository<Subject, String>{
+    Subject findBySubjectId(String subjectId);
+}
diff --git a/backend/src/main/java/hu/pazmany/User.java b/backend/src/main/java/hu/pazmany/User.java
index 40c2650f394c2363b275ca409e9d53e1b1e5569c..992c8fa542c49877619f8d428c798a1d2571232a 100644
--- a/backend/src/main/java/hu/pazmany/User.java
+++ b/backend/src/main/java/hu/pazmany/User.java
@@ -1,32 +1,24 @@
 package hu.pazmany;
 
-import jakarta.persistence.*;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 
 @Entity
-@Table(name = "`user`")
+@Table(name = "USERS")
 public class User {
     @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    private Long id;
-    private String fullName;
+    @Column(name = "username", unique = true, nullable = false)
     private String username;
-    private String password; //Ide fog kelleni egy enkriptálás (hajrá)
 
-    public Long getId() {
-        return id;
-    }
+    @Column(name = "password", nullable = false)
+    private String password;
 
-    public void setId(Long id) {
-        this.id = id;
-    }
+    @Column(name = "fullName")
+    private String fullName;
 
-    public String getFullName() {
-        return fullName;
-    }
-
-    public void setFullName(String fullName) {
-        this.fullName = fullName;
-    }
+    // Getters and setters
 
     public String getUsername() {
         return username;
@@ -43,4 +35,12 @@ public class User {
     public void setPassword(String password) {
         this.password = password;
     }
+
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
 }
diff --git a/backend/src/main/java/hu/pazmany/UserRepository.java b/backend/src/main/java/hu/pazmany/UserRepository.java
index 625c023b72bf664be1072cee3093a4d10254099b..b8ecb16735a4eda3bc528c7e2122239403118384 100644
--- a/backend/src/main/java/hu/pazmany/UserRepository.java
+++ b/backend/src/main/java/hu/pazmany/UserRepository.java
@@ -2,6 +2,6 @@ package hu.pazmany;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 
-public interface UserRepository extends JpaRepository<User, Long> {
+public interface UserRepository extends JpaRepository<User, String> {
     User findByUsername(String username);
 }
diff --git a/backend/src/test/java/hu/pazmany/DocumentRepositoryTests.java b/backend/src/test/java/hu/pazmany/DocumentRepositoryTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a289136f6e2cc159c4f2a01feb92b06990836cf
--- /dev/null
+++ b/backend/src/test/java/hu/pazmany/DocumentRepositoryTests.java
@@ -0,0 +1,107 @@
+package hu.pazmany;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+public class DocumentRepositoryTests {
+
+    @Autowired
+    private DocumentRepository documentRepository;
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @Autowired
+    private SubjectRepository subjectRepository;
+
+    @Test
+    public void testFindAllByUser() {
+        User user = new User();
+        user.setUsername("testUser");
+        user.setPassword("testPassword");
+        userRepository.save(user);
+
+        Subject subject = new Subject();
+        subject.setSubjectId("testId");
+        subject.setName("testName");
+        subjectRepository.save(subject);
+
+        int n = 4;
+        for (int i = 0; i < n; i++) {
+            Document document = new Document();
+            document.setUser(user);
+            document.setSubject(subject);
+            document.setTitle("testTitle" + i);
+            document.setFilepath("testFilepath" + i);
+            documentRepository.save(document);
+        }
+
+        List<Document> documents = documentRepository.findAllByUser(user);
+
+        assertThat(documents).hasSize(n);
+        for (int i = 0; i < n; i++) {
+            assertThat(documents.get(i).getUser().getUsername()).isEqualTo(user.getUsername());
+        }
+    }
+
+    @Test
+    public void testFindAllBySubject() {
+        Subject subject = new Subject();
+        subject.setSubjectId("testId");
+        subject.setName("testName");
+        subjectRepository.save(subject);
+
+        User user = new User();
+        user.setUsername("testUser");
+        user.setPassword("testPassword");
+        userRepository.save(user);
+
+        int n = 4;
+        for (int i = 0; i < n; i++) {
+            Document document = new Document();
+            document.setUser(user);
+            document.setSubject(subject);
+            document.setTitle("testTitle" + i);
+            document.setFilepath("testFilepath" + i);
+            documentRepository.save(document);
+        }
+
+        List<Document> documents = documentRepository.findAllBySubject(subject);
+
+        assertThat(documents).hasSize(n);
+        for (int i = 0; i < n; i++) {
+            assertThat(documents.get(i).getSubject().getSubjectId()).isEqualTo(subject.getSubjectId());
+        }
+    }
+
+    @Test
+    public void testFindById() {
+        Subject subject = new Subject();
+        subject.setSubjectId("testId");
+        subject.setName("testName");
+        subjectRepository.save(subject);
+
+        User user = new User();
+        user.setUsername("testUser");
+        user.setPassword("testPassword");
+        userRepository.save(user);
+
+        Document document = new Document();
+        document.setUser(user);
+        document.setSubject(subject);
+        document.setTitle("testTitle");
+        document.setFilepath("testFilepath");
+        documentRepository.save(document);
+
+        Document found = documentRepository.findById(document.getId()).get();
+
+        assertThat(found.getTitle()).isEqualTo(document.getTitle());
+    }
+}
\ No newline at end of file
diff --git a/backend/src/test/java/hu/pazmany/SubjectRepositoryTests.java b/backend/src/test/java/hu/pazmany/SubjectRepositoryTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..6b327b48e4d78ce069c64614c69597a7443f9551
--- /dev/null
+++ b/backend/src/test/java/hu/pazmany/SubjectRepositoryTests.java
@@ -0,0 +1,52 @@
+package hu.pazmany;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+import java.util.List;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+public class SubjectRepositoryTests {
+
+    @Autowired
+    private SubjectRepository subjectRepository;
+
+    @Test
+    public void testFindBySubjectId() {
+        Subject subject = new Subject();
+        subject.setSubjectId("testId");
+        subject.setName("testName");
+        subjectRepository.save(subject);
+
+        Subject found = subjectRepository.findBySubjectId(subject.getSubjectId());
+
+        // Ids have to be compared, as the objects differ, even if their data does not
+        assertThat(found.getSubjectId()).isEqualTo(subject.getSubjectId());
+    }
+
+    @Test
+    public void testFindAll() {
+        Subject subject = new Subject();
+        subject.setSubjectId("testId");
+        subject.setName("testName");
+        subjectRepository.save(subject);
+
+        int n = 4;
+        for (int i = 0; i < n; i++) {
+            Subject tempSubject = new Subject();
+            tempSubject.setSubjectId("testId" + i);
+            tempSubject.setName("testName" + i);
+            subjectRepository.save(tempSubject);
+        }
+
+        List<Subject> subjects = subjectRepository.findAll();
+
+        assertThat(subjects).hasSize(n+1);
+
+        assertThat(subjects.get(0).getSubjectId()).isEqualTo(subject.getSubjectId());
+    }
+}
\ No newline at end of file
diff --git a/backend/src/test/java/hu/pazmany/UserRepositoryTests.java b/backend/src/test/java/hu/pazmany/UserRepositoryTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c2b044ce61e9be392d1a81ef1d0fed4c1ee0339
--- /dev/null
+++ b/backend/src/test/java/hu/pazmany/UserRepositoryTests.java
@@ -0,0 +1,44 @@
+package hu.pazmany;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SpringBootTest
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
+public class UserRepositoryTests {
+
+	@Autowired
+	private UserRepository userRepository;
+
+	@Test
+	public void testUserRepository() {
+		// Create a new User
+		User user = new User();
+		user.setUsername("testUser");
+		user.setPassword("testPassword");
+
+		// Save the User
+		userRepository.save(user);
+
+		// Retrieve the User
+		User retrievedUser = userRepository.findByUsername("testUser");
+
+		// Assert that the retrieved User is the same as the one we saved
+		assertThat(retrievedUser).isNotNull();
+		assertThat(retrievedUser.getUsername()).isEqualTo(user.getUsername());
+		assertThat(retrievedUser.getPassword()).isEqualTo(user.getPassword());
+	}
+
+	@Test
+	public void testMissingUser() {
+		// Retrieve a User that doesn't exist
+		User retrievedUser = userRepository.findByUsername("missingUser");
+
+		// Assert that the retrieved User is null
+		assertThat(retrievedUser).isNull();
+	}
+}