エンティティの連携
MyData に、複数の MsgData を関連付ける。
package jp.abc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Entity
public class MsgData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
@NotNull
private Long id;
@Column
private String title;
@Column
@NotEmpty
private String message;
@ManyToOne
private MyData mydata;
public MsgData() {
super();
mydata = new 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 にもエンティティの連携に関連するコードを追加する。
package jp.abc;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Entity
public class MyData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
@NotNull
private long id;
@Column(length = 50, nullable = false)
@NotEmpty
private String name;
@Column(length = 200, nullable = true)
@Email
private String mail;
@Column(nullable = true)
@Min(value=0)
@Max(value=200)
private Integer 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 Integer getAge() {
return age;
}
public void setAge(Integer 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を永続化するためのリポジトリを用意する。
package jp.abc.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import jp.abc.MyData;
public interface MsgDataRepository extends JpaRepository<MyData, Long> {
}
HTMLテンプレートを作成する。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title th:text="${title}">top page</title>
<style type="text/css">
h1 {
font-size: 18pt;
font-weight: bold;
color: gray;
}
body {
font-size: 13pt;
color: gray;
margin: 5px 25px;
}
tr {
margin: 5x;
}
th {
padding: 5px;
color: white;
background: darkgray;
}
td {
padding: 5px;
color: black;
background: #f0f0f0;
}
</style>
</head>
<body>
<h1 th:text="${title}">MyMsg page</h1>
<p th:text="${msg}"></p>
<form method="post" action="/msg" th:object="${formModel}">
<input type="hidden" name="id" th:value="*{id}" />
<table>
<tr>
<td><label for="title">タイトル</label></td>
<td><input type="text" name="title" th:value="*{title}" />
</tr>
<tr>
<td><label for="message">メッセージ</label></td>
<td><textarea name="message" th:text="*{message}"></textarea></td>
</tr>
<tr>
<td><label for="mydata">MYDATA_ID</label></td>
<td><input type="text" name="mydata" /></td>
</tr>
<tr>
<td></td><td><input type="submit" /></td>
</tr>
</table>
</form>
<hr />
<table>
<tr>
<th>ID</th><th>名前</th><th>タイトル</th>
</tr>
<tr th:each="obj : ${datalist}">
<td th:text="${obj.id}"></td>
<td th:text="${obj.mydata.name}"></td>
<td th:text="${obj.title}"></td>
</tr>
</table>
</body>
</html>
新しくコントローラを作成する。
まずはGETメソッドに対応する部分だけを作成。
MsgDataController.java
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;
import jp.abc.repositories.MsgDataRepository;
@Controller
public class MsgDataController {
@Autowired
private MsgDataRepository repository;
@RequestMapping(value = "/msg", method=RequestMethod.GET)
public ModelAndView msg(ModelAndView mav) {
mav.setViewName("showMsgData");
mav.addObject("title", "Sample");
mav.addObject("msg", "MsgDataのサンプルです。");
MsgData msgdata = new MsgData();
mav.addObject("formModel", msgdata);
List<MsgData> list = repository.findAll();
mav.addObject("datalist", list);
return mav;
}
}
コントローラにPOSTメソッドを追加する。
package jp.abc;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import jp.abc.repositories.MsgDataRepository;
@Controller
public class MsgDataController {
@Autowired
private MsgDataRepository repository;
@RequestMapping(value = "/msg", method=RequestMethod.GET)
public ModelAndView msg(ModelAndView mav) {
mav.setViewName("showMsgData");
mav.addObject("title", "Sample");
mav.addObject("msg", "MsgDataのサンプルです。");
MsgData msgdata = new MsgData();
mav.addObject("formModel", msgdata);
List<MsgData> list = repository.findAll();
mav.addObject("datalist", list);
return mav;
}
@RequestMapping(value = "/msg", method=RequestMethod.POST)
public ModelAndView msgform(@Valid @ModelAttribute MsgData msgdata,
Errors result,
ModelAndView mav) {
if (result.hasErrors()) {
mav.setViewName("showMsgData");
mav.addObject("title", "Sample [ERROR]");
mav.addObject("msg", "値を再チェックしてください。");
return mav;
}
repository.saveAndFlush(msgdata);
return new ModelAndView("redirect:/msg");
}
}
HTMLテンプレートの以下の部分でエラーが出てるので変更しておく。
<input type="hidden" name="id" th:value="*{id}" />
↓↓↓↓↓↓
<input type="hidden" name="id" value="0" />




