我有一个运行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命令时获取数据,因此我肯定这里只是缺少一些简单的东西。任何帮助,我们将不胜感激。
答案 0 :(得分:1)
我已经弄清楚了它为什么不起作用的原因。我的应用程序以及运行postgres的Docker容器运行良好。问题是帐户表不在postgres中。
之所以如此,是因为表和插入语句未在我在postgres中创建的db上运行,而是在默认db(postgres)上创建了表。我意识到,当我在docker-compose.yml文件中被sql脚本分解时,对于每个.sql文件,它们都在连接到“ postgres”数据库的同时运行。通过在我的每个脚本中添加一个'\ c db',可以解决我所有的问题。