6月28日

エンティティの連携

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" />

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください