Tworzenie indywidualnych encji dla każdego zalogowanego użytkownika.

0

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 !!

0

Do postu dodaj Authentiaction i wyślij go do serwisu wraz z obiektem, potem w serwisie za pomocą tego auth... możesz pozyskać username aktualnie zalogowanego gracza a w następnie w repo playera znaleźć ową osobę i w Knight ustawić za pomocą setPlayer czy jak to się nazywa u ciebie i ostatecznie zapisać go w bazie danych

1 użytkowników online, w tym zalogowanych: 0, gości: 1