7月16日

投稿者: | 2020年7月16日

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