能够通过休眠连接到Postgres,但无法通过执行查询来获取数据

时间:2019-06-17 16:01:15

标签: java postgresql hibernate docker

我有一个运行postgres db的docker容器。该容器还会创建一个db,表和一些测试数据。我也有一个能够启动db的spring boot hibernate应用程序。但是,我无法执行任何查询并获取任何数据。

我已经测试过,通过将application.properties文件中的值更改为不存在的数据库名称来连接到正确的数据库-当我恢复为正确的数据库名称时,Java应用程序可以正常工作。

我还在application.properties文件中提供了spring.jpa.show-sql = true,这会打印出sql命令。当我在postgres上手动运行它时,它将返回数据。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@RestController
public class HelloController {

    @Autowired
    private AccountService accountService;

    @RequestMapping("/hi/{id}")
    public String hi(@PathVariable("id") int index) {
        return "Hi " + accountService.get(index).getName();
    }

    @RequestMapping("/all")
    public List<String> hey() {
        List<String> everyOne = new ArrayList<>();
        for (Account account : accountService.list()) {
            everyOne.add(account.getName());
        }
        return everyOne;
    }
}
@Service
public class AccountService {

    @Autowired
    private AccountRepository accountRepository;

    public List<Account> list() {
       return accountRepository.findAll();
    }

    public Account get(int index) {
        return accountRepository.getOne(index);
    }

}
@Repository
public interface AccountRepository extends JpaRepository<Account, Integer> {

}
@Entity
public class Account {

    @Id
    private int id;
    private String name;

    public Account() { }

    public Account(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return this.id;
    }

    public String getName() {
        return this.name;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
}
spring.datasource.url=jdbc:postgresql://localhost:5432/db
spring.datasource.username= postgres
spring.datasource.password=
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
spring.jpa.show-sql = true

在应用程序运行时,如果我卷曲http://localhost:8080/all,我希望可以返回Account表中的所有数据。

卷曲http://localhost:8080/hi/2时,我收到一条错误消息

  

'avax.persistence.EntityNotFoundException:无法找到   id为2'的com.something.models.Account。

由于我能够通过hibernate连接到数据库并在手动运行hibernate在psql命令行上生成的sql命令时获取数据,因此我肯定这里只是缺少一些简单的东西。任何帮助,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

我已经弄清楚了它为什么不起作用的原因。我的应用程序以及运行postgres的Docker容器运行良好。问题是帐户表不在postgres中。

之所以如此,是因为表和插入语句未在我在postgres中创建的db上运行,而是在默认db(postgres)上创建了表。我意识到,当我在docker-compose.yml文件中被sql脚本分解时,对于每个.sql文件,它们都在连接到“ postgres”数据库的同时运行。通过在我的每个脚本中添加一个'\ c db',可以解决我所有的问题。