Java - Получить имя пользователя из БД - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть сайт стороннего проекта, где люди могут комментировать материал, теперь мне нужно отобразить комментарии пользователя и имя пользователя комментатора.Проблема в том, что я не могу получить имя пользователя, вошедшего в систему.

Примеры комментариев:

1) Комментарий от - Shelo
Тестовый комментарий

2) КомментарийBy - ProGa
Тестовый комментарий 2

Теперь, проблема в том, что если я попытаюсь получить имя пользователя, вошедшего в систему в данный момент, оба комментария будут иметь одинаковое имя пользователякогда пользователь входит в систему

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

В приведенном выше примере кода показано, как вы вошли в систему.Поэтому, если я использую этот код и пытаюсь отобразить имя пользователя с помощью String name, и, скажем, некоторые пользователи входят в систему с именем пользователя - "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";
}

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 Ответ

0 голосов
/ 22 февраля 2019

Как уже упоминалось в комментариях, вы должны изменить свое моделирование данных.

Например, вы можете реализовать что-то вроде этого:

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

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

В этом случае у вас есть двунаправленная ассоциация, и вы можете получить пользовательскую форму комментария в коде (и в HTMLшаблон).Конечно, вы должны изменить свою модель БД, если вы делаете это вручную.

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