Staram się napisać prostą grę webową. W skrócie : każdy zalogowany gracz będzie mógł tworzyć od kilku do kilkunastu rycerzy.
Już na samym początku kodowania pojawił się problem. Otóż w jaki sposób mapować relacje użytkownika oraz rycerzy, aby każdy użytkownik posiadał indywidualną , niepowtarzalną stworzoną przez siebie listę rycerzy, którym w późniejszym etapie będzie przydzielał zadania
encja rycerza:
package bartosz.szablewski.middleAges.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Range;
@Setter
@Getter
@NoArgsConstructor
@Entity
@AllArgsConstructor
public class Knight {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NotNull
@Size(min = 2, max = 35, message = "Imie rycerza musi mieć między 2, a 35 znaków")
private String dignity;
@NotNull
@Range(min = 16, max = 50, message = "Wiek rycerza nie może być większy niż 50 i mniejszy niż 16")
private int age;
private int level;
@ManyToOne
@JoinColumn(name = "PLAYER_EMAIL")
private Player player;
public Knight(long id, String dignity, int age, int level) {
this.id = id;
this.dignity = dignity;
this.age = age;
this.level = 1;
}
public Knight(String dignity, int age, int level) {
this.dignity = dignity;
this.age = age;
this.level = 1;
}
}
encja gracza
package bartosz.szablewski.middleAges.domain;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.validation.constraints.Size;
import lombok.AllArgsConstructor;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Setter
@Getter
@NoArgsConstructor
@Entity
@AllArgsConstructor
public class Player {
@Id
@Email
@NotEmpty
@Column(unique = true)
private String email;
@Size(min = 6)
private String password;
@NotEmpty
@Size(min = 2)
private String firstName;
@NotEmpty
@Size(min = 2)
private String lastName;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "PLAYER_ROLES", joinColumns = {
@JoinColumn(name = "PLAYER_EMAIL", referencedColumnName = "email")},
inverseJoinColumns = {
@JoinColumn(name = "ROLE_NAME", referencedColumnName = "name")})
private List<Role> roles;
@OneToMany(mappedBy = "player")
private List<Knight> knights;
}
Repo rycerza
package bartosz.szablewski.middleAges.repository;
import bartosz.szablewski.middleAges.domain.Knight;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface KnightRepository extends JpaRepository<Knight, Long>{
public Knight save(Knight knight);
public List<Knight> findAll();
}
repo gracza
package bartosz.szablewski.middleAges.repository;
import bartosz.szablewski.middleAges.domain.Player;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PlayerRepository extends JpaRepository<Player, String>{
// public Optional<Player> findOne(String email);
}
service rycerza
package bartosz.szablewski.middleAges.service;
import bartosz.szablewski.middleAges.domain.Knight;
import bartosz.szablewski.middleAges.repository.KnightRepository;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class KnightService{
@Autowired
private KnightRepository knightRepository;
public Knight save(Knight knight){
return knightRepository.save(knight);
}
public List<Knight> findAll(){
return new ArrayList<>(knightRepository.findAll());
}
public void saveKnight(Knight knight) {
knightRepository.save(knight);
}
}
controler rycerza
package bartosz.szablewski.middleAges.controller;
import bartosz.szablewski.middleAges.domain.Knight;
import bartosz.szablewski.middleAges.service.KnightService;
import java.util.List;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class KnightController {
@Autowired
public KnightService knightService;
@GetMapping("/findAll")
public String getAllKnights(Model model) {
List<Knight> allKnight = knightService.findAll();
model.addAttribute("knights", allKnight);
return "views/listKnight";
}
@GetMapping("/save")
public String createKnight(String email, Model model, HttpSession session) {
session.setAttribute("email", email);
model.addAttribute("knight", new Knight());
return "views/knightForm";
}
@PostMapping("/saveKnight")
public String saveKnight(@Valid Knight knight, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
System.out.println("There were errors");
bindingResult.getAllErrors().forEach(error -> {
System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
});
return "views/knightForm";
} else {
knightService.saveKnight(knight);
return "redirect:/listKnight";
}
}
}
POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>bartosz.szablewski</groupId>
<artifactId>autumnOfTheMiddleAges</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>autumnOfTheMiddleAges</name>
<description>autumn of the middle ages</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/>
<!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<thymeleaf.version>3.0.2.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
</properties>
<dependencies>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
<version>3.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0-alpha.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
Na chwile obecna w bazie danych w tabeli "knight" kolumna "player_email" mam null, a powinien być email użytkownika który stworzył danego rycerza.
Proszę o pomoc oraz cenne uwagi do projektu. Z góry BARDZO DZIĘKUJE !!