首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Spring boot H2 DB与mongoDB

Spring boot H2 DB与mongoDB
EN

Stack Overflow用户
提问于 2020-11-11 06:24:17
回答 1查看 1.8K关注 0票数 0

当状态设置为"past“时,我想保存投票结果。我有一个H2数据库,想要添加一个只存储结果的mongoDB。我该如何使用Spring boot来实现这一点呢?

作为现在我有一个投票程序,您可以创建投票,编辑投票,投票等。

我已经为mongodb、spring boot、spring mvc和H2 db等添加了依赖项。

以下是我的应用程序属性:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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);
}

但在添加此存储库后,我收到了数百行错误:

Poll类:

代码语言:javascript
复制
@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;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2020-11-11 07:17:56

我无法重现您的问题,但我相信这是因为您正在尝试创建带有@Entity注释的类的@MongoRepository

@MongoRepository需要一个普通的POJO类或带有@Document注释的类。

请看以下内容:

代码语言:javascript
复制
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,无需配置):

代码语言:javascript
复制
<?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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64777660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档