我想使用Spring Boot创建消息应用程序。

huangapple 未分类评论63阅读模式
英文:

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&lt;Message, Long&gt;{
List&lt;Message&gt; findBySenderUser_UserId(int userId);
List&lt;Message&gt; findByReceiverUser_UserId(int userId);

@Modifying
@Query(value = &quot;insert into message (sender_user_id,receiver_user_id,message_content) &quot;
        + &quot;VALUES (:senderUserId,:receiverUserId,:messageContent)&quot;, nativeQuery = true)
@Transactional
void sendMessage(@Param(&quot;senderUserId&quot;) int senderUserId, @Param(&quot;receiverUserId&quot;) int receiverUserId,
        @Param(&quot;messageContent&quot;) String messageContent);
}

User Entiry

@Entity
@Transactional
@NamedQuery(name=&quot;User.findAll&quot;, query=&quot;SELECT u FROM User u&quot;)
public class User implements Serializable {
private static final long serialVersionUID = 1L;

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


//bi-directional many-to-one association to Message
@OneToMany(mappedBy=&quot;senderUser&quot;)
private List&lt;Message&gt; messages1;

//bi-directional many-to-one association to Message
@OneToMany(mappedBy=&quot;receiverUser&quot;)
private List&lt;Message&gt; messages2;

public User() {
}

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

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


public List&lt;Message&gt; getMessages1() {
    return this.messages1;
}

public void setMessages1(List&lt;Message&gt; 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&lt;Message&gt; getMessages2() {
    return this.messages2;
}

public void setMessages2(List&lt;Message&gt; 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=&quot;Message.findAll&quot;, query=&quot;SELECT m FROM Message m&quot;)
public class Message implements Serializable {
private static final long serialVersionUID = 1L;

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

@Column(name=&quot;message_content&quot;)
private String messageContent;

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

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

//受信者
@ManyToOne
@JoinColumn(name=&quot;receiver_user_id&quot;)
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(&quot;profile&quot;)
public class MessageController {

@Autowired 
UserRepository userRepository;
@Autowired
MessageReposioty messageRepository;

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

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

//送信時の処理
@PostMapping(&quot;/{userId}/message&quot;)
String sendMessage(@Validated MessageForm messageForm,
        @AuthenticationPrincipal LoginUserDetails userDetails,
        @PathVariable(&quot;userId&quot;) 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 &quot;redirect:{userId}/message&quot;;
}
}

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

</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]

ER

huangapple
  • 本文由 发表于 2020年3月15日 16:02:52
  • 转载请务必保留本文链接:https://java.coder-hub.com/60690841.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定