Java 我想使用spring boot创建消息应用程序

Java 我想使用spring boot创建消息应用程序,java,mysql,spring,spring-boot,thymeleaf,Java,Mysql,Spring,Spring Boot,Thymeleaf,我是日本人,很抱歉我的英语不好。 我使用Spring Boot创建了一个消息应用程序。 但我无法将数据插入到消息表中。 我使用了查询注释,但它不起作用。 我不明白当它是@manytone关系时如何插入。 所以我想要一些建议 SpringBoot 2.2.4。 mysql 8.0.18 存储库 @Repository @Transactional public interface MessageReposioty extends JpaRepository<Message, Long>

我是日本人,很抱歉我的英语不好。 我使用Spring Boot创建了一个消息应用程序。 但我无法将数据插入到消息表中。 我使用了查询注释,但它不起作用。 我不明白当它是@manytone关系时如何插入。 所以我想要一些建议

SpringBoot 2.2.4。 mysql 8.0.18

存储库

@Repository
@Transactional
public interface MessageReposioty extends JpaRepository<Message, Long>{
List<Message> findBySenderUser_UserId(int userId);
List<Message> findByReceiverUser_UserId(int userId);

@Modifying
@Query(value = "insert into message (sender_user_id,receiver_user_id,message_content) "
        + "VALUES (:senderUserId,:receiverUserId,:messageContent)", nativeQuery = true)
@Transactional
void sendMessage(@Param("senderUserId") int senderUserId, @Param("receiverUserId") int receiverUserId,
        @Param("messageContent") String messageContent);
}
@Entity
@Transactional
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="user_id")
private int userId;


//bi-directional many-to-one association to Message
@OneToMany(mappedBy="senderUser")
private List<Message> messages1;

//bi-directional many-to-one association to Message
@OneToMany(mappedBy="receiverUser")
private List<Message> messages2;

public User() {
}

public int getUserId() {
    return this.userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}


public List<Message> getMessages1() {
    return this.messages1;
}

public void setMessages1(List<Message> messages1) {
    this.messages1 = messages1;
}

public Message addMessages1(Message messages1) {
    getMessages1().add(messages1);
    messages1.setSenderUser(this);

    return messages1;
}

public Message removeMessages1(Message messages1) {
    getMessages1().remove(messages1);
    messages1.setSenderUser(null);

    return messages1;
}

public List<Message> getMessages2() {
    return this.messages2;
}

public void setMessages2(List<Message> messages2) {
    this.messages2 = messages2;
}

public Message addMessages2(Message messages2) {
    getMessages2().add(messages2);
    messages2.setReceiverUser(this);

    return messages2;
}

public Message removeMessages2(Message messages2) {
    getMessages2().remove(messages2);
    messages2.setReceiverUser(null);
    return messages2;
}
}
@Entity
@NamedQuery(name="Message.findAll", query="SELECT m FROM Message m")
public class Message implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="message_id")
private long messageId;

@Column(name="message_content")
private String messageContent;

@Temporal(TemporalType.TIMESTAMP)
@Column(name="message_time")
private Date messageTime;

//送信者
@ManyToOne
@JoinColumn(name="sender_user_id")
private User senderUser;

//受信者
@ManyToOne
@JoinColumn(name="receiver_user_id")
private User receiverUser;

public Message() {
}

public long getMessageId() {
    return this.messageId;
}

public void setMessageId(long messageId) {
    this.messageId = messageId;
}

public String getMessageContent() {
    return this.messageContent;
}

public void setMessageContent(String messageContent) {
    this.messageContent = messageContent;
}

public Date getMessageTime() {
    return this.messageTime;
}

public void setMessageTime(Date messageTime) {
    this.messageTime = messageTime;
}

public User getSenderUser() {
    return senderUser;
}

public void setSenderUser(User senderUser) {
    this.senderUser = senderUser;
}

public User getReceiverUser() {
    return receiverUser;
}

public void setReceiverUser(User receiverUser) {
    this.receiverUser = receiverUser;
}
控制器

@Controller
@RequestMapping("profile")
public class MessageController {

@Autowired 
UserRepository userRepository;
@Autowired
MessageReposioty messageRepository;

@ModelAttribute
public MessageForm messageForm() {
    return new MessageForm();
}

@GetMapping("/{userId}/message")
String showMessage(@PathVariable("userId") Integer userId,
        Model model) {
    User senderUser = userRepository.findById(userId).orElse(null);
    List<Message> recieveMessage = messageRepository.findByReceiverUser_UserId(userId);
    model.addAttribute("recieveMessage",recieveMessage);
    model.addAttribute("senderUser",senderUser);
    return "profile/message";
}

//送信時の処理
@PostMapping("/{userId}/message")
String sendMessage(@Validated MessageForm messageForm,
        @AuthenticationPrincipal LoginUserDetails userDetails,
        @PathVariable("userId") Integer userId,
        Model model) {
    User senderUser = userDetails.getUser();
    User receiverUser = userRepository.findById(userId).orElse(null);
    int senderUserId = senderUser.getUserId();
    int receiverUserId = receiverUser.getUserId();
    String messageContent = messageForm.getMessageContent();
    //insert
    messageRepository.sendMessage(senderUserId, receiverUserId, messageContent);
    return "redirect:{userId}/message";
}
}

**html**
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
    xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body th:with="user = ${#authentication.principal.user}">
    <h1>message</h1>
    <p th:text="${senderUser.userName}+'sendMessage'"></p>
        <form th:action="@{'/profile/'+${senderUser.userId}+'/message'}"     th:object="${messageForm}">
        <textarea placeholder="" th:field="*{messageContent}">
        </textarea>
        <input type="submit">
    </form>
</body>

“行不通”不够具体,无法提供帮助。你是说你收到了一条错误信息吗?没有结果?还有别的吗?请注意,通常JPA的一个主要好处是为您处理关系,因此您只需要
senderUser.getMessages2()
,Spring数据将自动为您进行ID查找,因此
@PathVariable(“userId”)User
应该可以工作。非常感谢您的评论。我想在messageTable中插入消息。但SQL语句是select。我在问题中添加了SQL语句。“不起作用”不够具体,无法提供帮助。你是说你收到了一条错误信息吗?没有结果?还有别的吗?请注意,通常JPA的一个主要好处是为您处理关系,因此您只需要
senderUser.getMessages2()
,Spring数据将自动为您进行ID查找,因此
@PathVariable(“userId”)User
应该可以工作。非常感谢您的评论。我想将消息插入messageTable。但SQL语句是select。我在问题中添加了SQL语句。
select message0_.message_id as message_1_4_,
message0_.message_content as message_2_4_, 
message0_.message_time as message_3_4_,
message0_.receiver_user_id as receiver4_4_,
message0_.sender_user_id as sender_u5_4_ from message message0_ left outer join user user1_ on message0_.receiver_user_id=user1_.user_id where user1_.user_id=?
2020-03-15 16:21:59.592 TRACE 14537 --- [nio-8080-exec-1]     o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as     [INTEGER] - [3]