英文:
I want to create message application by using spring boot
问题
我是日本人,对不起我的英语不好。
我使用Spring Boot创建了一个消息应用程序。
但是我无法将数据插入到消息表中。
我使用了查询注解,但它不起作用。
我不明白在@ManyToOne关系下如何插入数据。
所以我想要一些建议。
SpringBoot 2.2.4.
mysql 8.0.18
Repository
@Repository
@Transactional
public interface MessageRepository 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);
}
User Entity
@Entity
@Transactional
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u")
public class User implements Serializable {
// ... 省略其他代码
}
Message Entity
@Entity
@NamedQuery(name = "Message.findAll", query = "SELECT m FROM Message m")
public class Message implements Serializable {
// ... 省略其他代码
}
Controller
@Controller
@RequestMapping("profile")
public class MessageController {
// ... 省略其他代码
}
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>
</html>
查询日志和ER图请参考链接 ER。
英文:
I'm Japanese, sorry for my bad English.
I have created a message application by using Spring Boot.
but I can't insert data into message table.
I used query annotation but It won't work.
I can't understand how to insert when its @ManyToOne relation.
so I'd like some advice.
SpringBoot 2.2.4.
mysql 8.0.18
Repository
@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);
}
User Entiry
@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;
}
}
Message Entity
@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
@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>
</html>
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]
专注分享java语言的经验与见解,让所有开发者获益!
评论