как добавить пользователя в команду на страницу администратора - PullRequest
1 голос
/ 16 января 2020

Я не могу понять, как реализовать добавление пользователя в Team на странице администратора. Я написал метод add в контроллере, я не могу понять, как показать все это в интерфейсе. Нужны два списка, один список всех команд и второй список всех пользователей, а затем сохранить? начал изучать тимьяна и много странных вещей.

admin. html

 </head>
    <body>

    <h1>Admin page </h1>

    <!--
    <form action="#" th:action="@{/admin}" th:object="${team}" method="post">
        <p>Add Team: <input type="text" th:field="*{name}" /></p>
        <p><input type="submit" value="addTeam" />

    </form>
    -->

    <form th:action="@{/logout}" method="post">
        <input type="submit" value="Sign Out"/>


    </form>

    </body>
    </html>

Пользователи

 @Entity
    @Table(name="users")
    public class Users {
        @Id
        @Column(name="email",unique = true, nullable = false,length = 200)
        String email;

        @Column(name="name",nullable = false,length = 200)
        String name;

        @Column(name="password",nullable = false,length = 128)
        @JsonIgnore 
        String password;


        @Column(name = "avatar", nullable = true)
        String avatar;

        @ManyToOne
        @JoinColumn(name="team_id", nullable=true)
        Team team;

        @ManyToOne
        @JoinColumn(name="role", nullable=false)
        @JsonIgnore        
        Role role;

        public Users() {
        }

         get und set
    }

Команда

 Entity
    @Table(name="team")
    public class Team  {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        Long id;

        @Column
        String name;

        @Column
        String url;

        @Lob
        @Column(name = "avatar",nullable = true,columnDefinition="BLOB")
        String avatar;


        @OneToMany(mappedBy="team",cascade = CascadeType.ALL, orphanRemoval = true)
        @JsonIgnore
        Set<Users> users = new HashSet<>();

        public Team() {
        }
     get und set

AdminController

@ Controller // RestController publi c class AdminController {

    .....

     @GetMapping("/admin/team")
        List<Team> allTeams() {
          return teamRepository.findAll();
        }

     @RequestMapping(value = "/admin/team/{id}/user/{email}", method = RequestMethod.POST,produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
        public Users addUserToTeam(
                @PathVariable long id,@PathVariable String  email)  {
                Team team = teamRepository.findById(id).orElseThrow(() -> new NoSuchTeamException("Team not found"));
                Users user = userRpRepository.findById(email).orElseThrow(() -> new NoSuchUserException("User not found"));
                user.setTeam(team);
                user  = userRpRepository.save(user);
            return user;




 @RequestMapping(value = "/admin", method = RequestMethod.GET)
        public String adminPage(Model model) {
            model.addAttribute("admin",new Team());
            return "admin";
        }
            }

1 Ответ

0 голосов
/ 16 января 2020

Идеологически из структуры RMDB лучше создать таблицу связей между пользователем и командой.

пользователь

@Entity
@Table(name = "user")
public class User {

    @Id
    @Column(name = "email", length = 200) //@Id controls nullable and unique
    private String email;

    @Column(name = "name", nullable = false, length = 200)
    private String name;

    @Column(name = "password", nullable = false, length = 128)
    @JsonIgnore 
    private String password;

    @Column(name = "avatar", nullable = true)
    private String avatar;

    @ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
    @JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "user_id",
            foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false),
            inverseJoinColumns = @JoinColumn(name = "team_id",
            foreignKey = @ForeignKey(name = "fk_user_team_team"), nullable = false))
    private Set<Team> teams;
}

команда

@Entity
@Table(name = "team")
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    @Column
    private String name;

    @Column
    private String url;

    @Lob
    @Column(name = "avatar", nullable = true, columnDefinition = "BLOB")
    private String avatar;


    @ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
    @JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "team_id",
            foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false),
            inverseJoinColumns = @JoinColumn(name = "user_id",
            foreignKey = @ForeignKey(name = "fk_user_team_user"), nullable = false))
    private Set<User> users;
}

UserTeam

@Entity
@Table(name = "user_team", uniqueConstraints =
        @UniqueConstraints(columnNames = {"user_id", "team_id"}, name = "uniq_some")
public class UserTeam {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; //it's easier to create new Long Id key then composite key with user_id and team_id

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false)
    private User user;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "team_id", foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false)
    private Team team;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "role_id", nullable = false) //I don't see Role entity but think it has id field
    @JsonIgnore  
    private Role role;
}

С этой структурой вы можете получить всех пользователей для Команды и всех команд для Пользователя. Коллекции ленивы, поэтому вам нужно использовать @Transactional, например, для соответствующих методов обслуживания.

И эта структура является двунаправленной: если вы добавите нового пользователя в коллекцию пользователей в объекте Team, JPA создаст нового пользователя , Но ... таблица связей содержит еще одно обязательное поле role_id, поэтому при таком добавлении вы получите исключение. Поэтому лучше сначала создать объекты User и Team, а затем создать объект связывания UserTeam с требуемой ролью (или установить роль по умолчанию, и все новые объекты будут созданы с этой ролью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...