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;
}