【发布时间】:2016-11-13 09:53:27
【问题描述】:
我开始使用 Spring Boot,作为其中的一部分,我想创建一个内存数据库以使用和引导应用程序。
鉴于下面的配置/代码,我在启动日志中没有错误,并且可以正常访问应用程序,所以它确实启动了(我收到关于对象不存在的模板错误),但我没有从调用 findAll() 时的 DAO(或者如果我尝试调用 findById(int) )。
因此,虽然看起来一切正常(日志中没有错误,日志显示它找到了创建模式广告尝试运行 data.sql 语句的 sql),但当我尝试通过 DAO 访问数据时,我没有收到异常,但是没有数据返回。
对可能有问题的代码有任何想法或意见吗?
我已将 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>
Spring DAO:
public interface PersonDao extends CrudRepository<Person, Integer> {
}
application.properties 中的 DB 属性:
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;
}
}
资源/中的Schema.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));
在 data.sql 中(同样在资源目录中):
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');
我正在尝试检索的实体类(尝试使用对我来说也是新的 Lombock 来生成 getter/setter):
@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;
}
【问题讨论】:
-
您是否在您的
application.properties中设置了spring.datasource.initialize? -
开启sql日志查看是否有日志:在application.properties中添加
spring.jpa.show-sql=true。也许看看你是否设置了所有必要的注释。也许@Transactional不见了?
标签: spring hibernate spring-boot spring-data h2