Java-从数据库获取用户名

Java-从数据库获取用户名,java,spring-boot,spring-security,spring-data-jpa,thymeleaf,Java,Spring Boot,Spring Security,Spring Data Jpa,Thymeleaf,我有一个侧项目网站,人们可以在那里对东西发表评论,现在我需要显示用户的评论和评论者的用户名。问题是我无法获取登录用户的用户名 注释示例: (一) 评论人-Shelo 测试评论 (二) 评论人-ProGa 测试评论2 现在的问题是,如果我尝试获取“当前登录”用户的用户名,那么当用户登录时,两条注释将具有相同的用户名 Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication(); String

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

注释示例:

(一) 评论人-Shelo
测试评论

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

现在的问题是,如果我尝试获取“当前登录”用户的用户名,那么当用户登录时,两条注释将具有相同的用户名

Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
String name = loggedInUser.getName();
上面的代码示例是您当前登录用户的方式。因此,如果我使用此代码并尝试通过
字符串名称显示用户名,并且假设一些用户使用用户名登录-“Davos”,这两条注释将如下-:

(一) 达沃斯评论
测试评论

(二) 达沃斯评论
测试评论2

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

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


如评论中所述,您必须更改数据建模

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

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

@Entity
public class Comment {
   @ManyToOne
   @JoinColumn(name="user_fk")
   public User user;
   ...
}
@实体
公共类用户{
@OneToMany()
公众收集意见;
...
}
@实体
公开课评论{
@许多酮
@JoinColumn(name=“user\u fk”)
公共用户;
...
}

在这种情况下,您有一个双向关联,您可以通过代码(和html模板)获取用户表单的注释。当然,如果您是手动操作,您也必须更改您的DB模型

如评论中所述,您必须更改数据建模

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

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

@Entity
public class Comment {
   @ManyToOne
   @JoinColumn(name="user_fk")
   public User user;
   ...
}
@实体
公共类用户{
@OneToMany()
公众收集意见;
...
}
@实体
公开课评论{
@许多酮
@JoinColumn(name=“user\u fk”)
公共用户;
...
}

在这种情况下,您有一个双向关联,您可以通过代码(和html模板)获取用户表单的注释。当然,如果您是手动操作,您也必须更改您的DB模型

这是建模的基础。您需要通过向
comment
实体添加
userId
属性来添加对注释的
作者的引用。然后,无论何时需要显示作者的姓名,都可以从数据库中查询Manh所说的是正确的。您已经有了一个从
User
Comments
@OneToMany
关系,您所需要的就是添加一个从
Comments
User
@manytone
关系。这是建模的基础。您需要通过向
comment
实体添加
userId
属性来添加对注释的
作者的引用。然后,无论何时需要显示作者的姓名,都可以从数据库中查询Manh所说的是正确的。你已经有了一个从
User
Comments
@OneToMany
关系,你所需要的就是添加一个从
Comments
User
@ManyToOne
关系。所以我添加了
@ManyToOne
关联,在创建
Comments
后,它会正确地添加到数据库中。但是,当我试图通过-
comment.getUser().getUserName()
访问注释的
user
时,我得到了NullPointerException,为什么我需要更改DB模型?数据库中的注释表中是否有user\fk列?是的。我与
User->User\u role->role
Menu->Menu\u component->components
Menu->Menu\u comments->comments
User->User\u comments->comments
有关联,我想我找到了获取用户名的正确途径,我会让你知道:)所以我添加了
@ManyToOne
关联,在创建
注释后,它被正确地添加到数据库中。但是,当我试图通过-
comment.getUser().getUserName()
访问注释的
user
时,我得到了NullPointerException,为什么我需要更改DB模型?数据库中的注释表中是否有user\fk列?是的。我与
User->User\u role->role
Menu->Menu\u component->components
Menu->Menu\u comments->comments
User->User\u comments->comments
我想我找到了获取用户名的正确途径,我会让你知道:)
@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
@Entity
public class User {
   @OneToMany()
   public Collection<Comment> comments;
   ...
}

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