【问题标题】:how to add user to team to admin page如何将用户添加到团队到管理页面
【发布时间】:2020-01-16 18:56:55
【问题描述】:

我不明白如何在管理页面上实现将用户添加到团队。 我在控制器中写了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

管理员控制器

@Controller//RestController 公共类 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";
        }
            }

【问题讨论】:

  • 看看github.com/spring-projects/spring-petclinic 。 Petclinic 是了解“经典”spring 服务器端渲染应用程序如何工作的一个很好的起点。它使用 Spring Boot 2.2 和百里香叶。您的问题很宽泛,无法回答;您的帖子应该返回一个新的 View 或重定向到一个 GET 并且不应该返回 User 实体。
  • 我想在管理页面上选择一个已经存在的用户并选择团队。然后通过单击添加按钮,我将此用户添加到此团队。

标签: java spring thymeleaf


【解决方案1】:

从 RMDB 结构的思想上来说,更好的方法是创建 User 和 Team 之间的联动表。

用户

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

用户团队

@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 对象,然后使用所需的 Role 创建 UserTeam 链接对象(或设置默认 Role,所有新对象都将使用此 Role 创建)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2019-04-11
    • 2011-12-25
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多