当前位置: 首页 > 知识库问答 >
问题:

Java-从数据库获取用户名

毛成济
2023-03-14

我有一个辅助项目网站,人们可以在那里评论东西,现在我需要显示用户的评论和评论者的用户名。问题是,我无法获得登录用户的用户名。

评论示例:

1) 评论人-Shelo
测试评论

2) 评论人-ProGa
测试评论2

现在的问题是,如果我试图获取“当前登录”用户的用户名,当用户登录时,两条评论都会有相同的用户名

Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
String name = loggedInUser.getName();

上面的代码示例是您当前登录用户的方式。因此,如果我使用这段代码,并尝试通过字符串名称显示用户名,假设一些用户使用用户名“Davos”登录,这两条评论将如下所示:

1) 评论人:达沃斯
测试评论

2)评论者-达沃斯
测试评论2

我需要的是——获取登录用户的用户名,如果他留下评论,显示他的用户名。当他注销或其他用户登录时,评论的“用户名”应保持不变,并且不得因当前登录的用户而改变。

我的数据库模式

控制器类别(仅相关代码):

@GetMapping("/foodDescription/{id}")
public String foodDescriptionPage(Model model, @PathVariable(name = "id") String id){
    menuRepository.findById(id).ifPresent(o -> model.addAttribute("menu", o));


    return "food-description";
}

@PostMapping("/postComment/{id}")
public String postComment(@RequestParam String myComment, Model model, @PathVariable(name = "id") String id){

    Optional<Menu> menu = menuRepository.findById(id);
    menuRepository.findById(id).ifPresent(o -> model.addAttribute("menu", o));
    List<Comments> myCommentsList = menu.get().getComments();
    myCommentsList.add(new Comments(myComment));

    menu.get().setComments(myCommentsList);
    menuRepository.save(menu.get());

    return "food-description";
}

食物描述。html(仅适用于注释部分的相关代码):

    <h3 th:text = "Comments">asd</h3>
<form th:action = "@{/postComment/{myMenuId}(myMenuId=${menu.id})}" method="POST">
    <textarea rows="2" cols="100" name="myComment"></textarea>
    <input type="submit" th:value="Add"/>
</form>

<div class="comment" th:each="com : ${menu.comments}">
    <h3 th:text="Display Commenter's Username here">Commenter's Username</h3>
    <ul>
        <li th:text = "${com.comment}">Comment</li>
    </ul>
</div>

用户实体:

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

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

    @Column(name = "username")
    private String userName;

    @Column(name = "password")
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "users_role",
    joinColumns = @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Role role;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinTable(name = "users_comments",
    joinColumns = @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "comment_id"))
    private List<Comments> comments = new ArrayList<>();

    // Getters/Setters/Constructor

}

注释实体:

@Entity
@Table(name = "comments")
public class Comments {

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

    @Column(name = "comment")
    private String comment;

    // Getters/Setters/Constructor

共有1个答案

易炳
2023-03-14

正如评论中提到的,您必须更改数据建模。

例如,您可以实现如下内容:

@Entity
public class User {
   @OneToMany()
   public Collection<Comment> comments;
   ...
}

@Entity
public class Comment {
   @ManyToOne
   @JoinColumn(name="user_fk")
   public User user;
   ...
}

在这种情况下,您有一个双向关联,并且您能够在代码(和html模板)中获得用户表单注释。当然,如果您手动操作,您也必须更改数据库模型。

 类似资料:
  • 本文向大家介绍node.js从数据库获取数据,包括了node.js从数据库获取数据的使用技巧和注意事项,需要的朋友参考一下 本文需要用node.js做一个从Sqlserver获取数据并显示到页面上的小功能,下面就为大家分享: app.js: 接下来就直接在页面中使用get方式请求即可,当然post方式也是类似原理。 还有我发现textarea控件在改变其text和html属性的时候,value还保

  • 问题内容: 我已经搜索了许多网站,但没有遇到任何从单个数据库获取表名的细节的代码或教程。 假设我有4个数据库,并且我想要数据库中所有表的名称,我可以使用什么查询? 问题答案:

  • 问题内容: 我有这个数据库结构 我需要的是在特定日期登录的所有用户的列表,例如 我目前正在尝试通过单个SQL查询完成此操作,但是我真的不知道如何获取表中记录的所有时间的时间跨度以及如何将其连接到登录的用户。 我最大的问题是如何创建数据库中所有时间的“虚拟”表… 问题答案: 编辑 CTE的二进制增长,而不是线性增长。2 ^ 100个日期应在合理范围内。

  • 我用的是Spring Security。配置的一部分: 例如,我如何在Spring MVC控制器中获得当前用户平衡?

  • 我正在寻找一种方法,以数组[]或字符串等格式从Firebase实时数据库获取数据。 我的数据库如下所示:链接到数据库的图像 或者: