#java #spring #database #mongodb #spring-boot
#java #весна #База данных #mongodb #весенняя загрузка
Вопрос:
Я хочу сохранить результаты опроса, когда статус установлен на «прошлое». У меня есть H2 db, и я хочу добавить MongoDB, в котором хранятся только результаты. Как мне реализовать это с помощью Spring boot?
На данный момент у меня есть программа опроса, в которой вы можете создавать опросы, редактировать опросы, голосовать за опросы и т. Д.
Я добавил зависимости для mongodb, spring boot, spring mvc и H2 db и т.д.
Это мои свойства приложения:
spring.datasource.url=jdbc:h2:file:./db;AUTO_RECONNECT=TRUE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
#Mongo Config
spring.main.allow-bean-definition-overriding=true
spring.data.mongodb.database=db-mongo
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost
Я попытался создать интерфейс MongoRepository:
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import project.dat250.entity.Poll;
import project.dat250.entity.User;
import java.util.List;
public interface ImongoRepository extends MongoRepository<Poll, Integer>, PagingAndSortingRepository<Poll, Integer> {
List<Poll> findByNameContainingIgnoreCase(@Param("name") String name);
List<Poll> findByUser(@Param("user") User user);
List<Poll> findByIsPublic(@Param("isPublic") boolean isPublic);
List<Poll> findByStatus(@Param("status") String status);
}
Но я получаю сотни строк ошибок после добавления этого репозитория:
Класс опроса:
@Data
@Entity
public class Poll {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Setter(AccessLevel.PROTECTED)
private int pollID;
private String name;
private String description;
private boolean isPublic;
private int voteGreen;
private int voteRed;
private String status;
private int timeLimit;
@ManyToOne
private User user;
@ManyToMany(cascade = CascadeType.PERSIST)
private List<User> usersVoted = new ArrayList<>();
public Poll() {
}
public Poll(String name, String description, boolean isPublic, int voteGreen, int voteRed, String status,
int timeLimit, User user) {
this.name = name;
this.description = description;
this.isPublic = isPublic;
this.voteGreen = voteGreen;
this.voteRed = voteRed;
this.status = status;
this.timeLimit = timeLimit;
this.user = user;
}
public void setUsersVoted(User userVoted) {
this.usersVoted.add(userVoted);
}
public void setUser(User user) {
this.user = user;
if (user != null)
user.setPolls(this);
}
public void setVoteRed(int red) {
this.voteRed = red;
}
public void setVoteGreen(int green) {
this.voteGreen = green;
}
public void setPublic(boolean isPublic) {
this.isPublic = isPublic;
}
}
Комментарии:
1. Можете ли вы показать класс опроса?
2. Добавлен класс опроса!
3. Опрос — это класс сущности JPA. MongoRepository не совместим с
@Entity
. Так и должно быть@Document
.4. Вы читаете из таблицы базы данных H2 и записываете ее в коллекцию базы данных MongoDB. Что это за процесс, который читает и записывает?
Ответ №1:
Я не смог воспроизвести вашу проблему, но я считаю, что это потому, что вы пытаетесь создать @MongoRepository
класс с аннотацией @Entity
.
Для @MongoRepository требуется простой класс POJO или класс с аннотацией @Document.
Смотрите это:
package gt.demo64777660;
import lombok.Data;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
interface MongoRepo extends MongoRepository<PollMongo, Integer> {
List<PollMongo> findByIsPublic(boolean isPublic);
}
//A: doesn't work
//interface MongoRepoFromJpaEntity extends MongoRepository<PollJpa, Integer> {
// List<PollJpa> findByIsPublic(boolean isPublic);
//}
interface JPARepo extends JpaRepository<PollJpa, Integer> {
List<PollJpa> findByIsPublic(boolean isPublic);
}
//@org.springframework.data.mongodb.core.mapping.Document(collection = "poll") //B: this is optional
@Data
class PollMongo {
// @org.springframework.data.annotation.Id //B: this is optional
int id;
String name;
boolean isPublic;
}
@Data
@javax.persistence.Entity
class PollJpa {
@javax.persistence.Id
int id;
String name;
boolean isPublic;
}
Зависимости (использует H2 и встроенный mongo, настройка не требуется):
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>gt.mobgo</groupId>
<artifactId>mongo-h2-spring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>