我开始玩SpringBoot,作为其中的一部分,我想创建一个内存中的DB来使用和引导应用程序。
考虑到下面的配置/代码,我在启动日志中没有错误,可以正常访问应用程序,因此它确实会启动(我会得到关于不存在的对象的模板错误),但在调用findAll()时(或者如果我尝试调用findById(int)),我不会从DAO返回任何数据。
因此,当我尝试通过DAO访问数据时,虽然看起来一切正常(日志中没有错误,但日志显示它会找到用于创建模式的sql,并尝试运行data.sql语句),但我没有收到异常,但没有返回数据。
对可能存在问题的代码有任何想法或观察吗?
我已将Spring Data/H2添加到我的pom中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
public interface PersonDao extends CrudRepository<Person, Integer> {
}
应用程序属性中的数据库属性:
server.contextPath=/
server.port=8080
spring.mvc.view.suffix=.ftl
datasource.mine.jdbcUrl=jdbc:h2:tcp://localhost/mem:clubmanagement
datasource.mine.user=sa
datasource.mine.password=
datasource.mine.poolSize=30
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=DEBUG
spring.jpa.hibernate.ddl-auto=create
我的服务:
@Service
public class MemberServiceImpl implements MemberService {
@Autowired
PersonDao dao;
@Override
public Optional<ClubMember> getClubMember(int id) {
Person dbPerson = dao.findOne(id);
if(dbPerson == null) {
return Optional.empty();
}
return Optional.of(fromEntity(dbPerson));
}
@Override
public List<ClubMember> allMembers() {
Iterable<Person> people = dao.findAll();
List<ClubMember> members = new ArrayList<>();
people.forEach(person -> {
members.add(fromEntity(person));
});
return members;
}
private ClubMember fromEntity(Person p) {
ClubMember member = new ClubMember();
member.setCurrentGrade(p.getCurrentGrade());
member.setFirstName(p.getFirstName());
member.setLastName(p.getLastName());
member.setAssociationMemberId(p.getAssociationMemberId());
member.setLastGradingDate(p.getLastGradingDate());
return member;
}
}
架构。资源/中的sql:
create table CLUB
(id int not null, name varchar(60), association_member_id int);
create table PERSON
(
id int not null, grade_id int, first_name varchar(35), last_name varchar(35),
association_membership varchar(12), last_grading_date date
);
create table GRADE
(id int not null, name varchar(20));
在数据中。sql(同样在resources目录中):
insert into club (id, name, association_member_id) values (1, 'some club', '123');
insert into person (id, grade_id, first_name, last_name, association_membership, last_grading_date)
values (1, 1, 'name', 'lastname', 'a1234', '2016-03-23');
@Entity
@Table(name = "person")
public @Data class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@JoinColumn(name = "grade_id")
private GRADE currentGrade;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "association_membership")
private String associationMemberId;
@Column(name = "last_grading_date")
@Temporal(value = TemporalType.DATE)
private Date lastGradingDate;
}