1対多の関連を作る。
ひとつのMyDataに対して、複数のMsgDataが関連付けられるようにする。
MsgDataクラスを作成する。
package jp.abc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotEmpty;
import com.sun.istack.NotNull;
@Entity
public class MsgData {
@Id
@Column
@GeneratedValue
@NotNull
private long id;
@Column
@NotEmpty
private String title;
@Column
@NotEmpty
private String message;
@ManyToOne
private MyData myData;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public MyData getMyData() {
return myData;
}
public void setMyData(MyData myData) {
this.myData = myData;
}
}
MyDataにmsgDatasフィールドを追加して、getter/setterを用意する。
package jp.abc;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import com.sun.istack.NotNull;
@Entity // my_dataテーブルと関連付けられる
public class MyData {
@Id
@Column
@GeneratedValue
@NotNull
private long id;
@Column(length = 100, nullable = false)
@NotEmpty
private String name;
@Column(length = 100, nullable = false)
@NotEmpty
@Email
private String mail;
@Column
@Min(0)
private int age;
@Column(nullable = true)
private String memo;
@OneToMany
private List<MsgData> msgDatas;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
public List<MsgData> getMsgDatas() {
return msgDatas;
}
public void setMsgDatas(List<MsgData> msgDatas) {
this.msgDatas = msgDatas;
}
}
MsgDataをデータベースに保存するためのRepositoryを用意する。
package jp.abc;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MsgDataRepository extends JpaRepository<MsgData, Long> {
public Optional<MsgData> findById(long id);
}
MsgData用のテンプレートを作成する。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>msgdata</title>
</head>
<body>
<div th:fragment="msgdata">
<h1>MsgData</h1>
<p>MsgDataフラグメント</p>
<p th:text="${msg}"></p>
<form action="/msg" method="post" th:object="${msgdata}">
<table>
<tr>
<th>タイトル</th>
<td>
<input type="text" name="title" th:value="*{title}" />
<div th:if="${#fields.hasErrors('title')}" th:errors="*{title}"></div>
</td>
</tr>
<tr>
<th>メッセージ</th>
<td>
<textarea name="message" th:value="*{message}"></textarea>
<div th:if="${#fields.hasErrors('message')}" th:errors="*{message}"></div>
</td>
</tr>
<tr>
<th>MyDataのid</th>
<td>
<input type="text" name="mydata" th:value="*{mydata}" />
<div th:if="${#fields.hasErrors('mydata')}" th:errors="*{mydata}"></div>
</td>
</tr>
<tr>
<th></th><td><input type="submit" value="登録" /></td>
</tr>
</table>
</form>
<table>
<tr>
<th>ID</th>
<th>名前</th>
<th>タイトル</th>
</tr>
<tr th:each="msgdata : ${list}">
<td th:text="${msgdata.id}"></td>
<td th:text="${msgdata.mydata.name}"></td>
<td th:text="${msgdata.title}"></td>
</tr>
</table>
</div>
</body>
</html>
MsgDataController を作成する。
package jp.abc;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MsgDataController {
@Autowired
private MsgDataRepository repository;
@RequestMapping(value = "/msg", method = RequestMethod.GET)
public ModelAndView msg(ModelAndView mav) {
List<MsgData> list = repository.findAll();
mav.addObject("list", list);
mav.addObject("template", "msgdata");
mav.addObject("fragment", "msgdata");
mav.setViewName("layout");
MsgData msgData = new MsgData();
mav.addObject("msgdata", msgData);
return mav;
}
}
repositoryだけではうまく見つけられないようなので、DAOを作成する。
package jp.abc;
import java.util.List;
public interface MsgDataDao {
public List<MsgData> findAll();
public MsgData findById(long id);
}