STS4 -> File -> Spring Starter Project
SQL: JPA, PostgreSQL
Template Engines: Thymeleaf
Web: Web
ドメイン層: Model, Repository, Service
アプリケーション層: Controller, View(HTML)
# postgresでデータベース作成
$ createdb test -O root
Spring Bootの設定はapplication.propertiesに集約されている
application.properties
spring.jpa.database=POSTGRESQL spring.datasource.url=jdbc:postgresql://localhost:5432/test spring.datasource.username=root spring.datasource.password=hoge spring.jpa.hibernate.ddl-auto=validate spring.jpa.properties.hibernate.format_sql=true spring.datasource.sql-script-encoding=UTF-8 logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# ライブラリ追加
<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-java8time</artifactId> <scope>2.1.0.RELEASE</scope> </dependency>
モデルの配下にエンティティを作成していく
User.java
package mrs.domain.model; import java.io.Serializable; import javax.persistence.*; @Entity @Table(name="usr") public class User implements Serializable { @Id private String userId; private String password; private String firstName; private String lastName; @Enumerated(EnumType.STRING) private RoleName roleName; }
RoleName.java
package mrs.domain.model; public enum RoleName { ADMIN, USER }
MeetingRoom.java
package mrs.domain.model; import java.io.Serializable; import javax.persistence.*; @Entity public class MeetingRoom implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer roomId; private String roomName; }
ReservableRoom.java
package mrs.domain.model; import java.io.Serializable; import javax.persistence.*; @Entity public class ReservableRoom implements Serializable { @EmbeddedId private ReservableRoomId reservableRoomId; @ManyToOne @JoinColumn(name="room_id", insertable=false, updatable= false) @MapsId("roomId") private MeetingRoom meetingRoom; public ReservableRoom(ReservableRoomId reservableRoomId) { this.reservableRoomId = reservableRoomId; } public ReservableRoom() { } }
ReservedRoomId.java
package mrs.domain.model; import java.io.Serializable; import java.time.LocalDate; import javax.persistence.Embeddable; @Embeddable public class ReservableRoomId implements Serializable { private Integer roomId; private LocalDate reservedDate; public ReservableRoomId(Integer roomId, LocalDate reservedDate) { this.roomId = roomId; this.reservedDate = reservedDate; } public ReservableRoomId() { } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((reservedDate == null)? 0 : reservedDate.hashCode()); result = prime * result + ((roomId == null) ? 0 : roomId.hashCode()); return result; } @Override public boolean equals(Object obj) { if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()) return false; ReservableRoomId other = (ReservableRoomId) obj; if(reservedDate == null) { if(other.reservedDate != null) return false; } else if (!reservedDate.equals(other.reservedDate)) return false; if(roomId == null) { if(other.roomId != null) return false; } else if (!roomId.equals(other.roomId)) return false; return false; } }
Reservation.java
package mrs.domain.model; import java.io.Serializable; import time.LocalTime; import javax.persistence.*; @Entity public class Reservation implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer reservationId; private LocalTime startTime; private LocalTime endTime; @ManyToOne; @JoinColumns({@JoinColumn(name = "reserved_date"), @JoinColumn(name = "room_id")}) private RservableRoom reservableRoom; @ManyToOne @JoinColumn(name="user_id") private User user; }