gpt4 book ai didi

java - 在数据库中为用户和消息之间的 OneToMany 关系创建 NULL 值

转载 作者:行者123 更新时间:2023-11-29 03:21:31 26 4
gpt4 key购买 nike

我正在尝试在 User 类和 Message 类之间创建 OneToMany 关系。一个用户可以有多条消息。但是当我将它保存在数据库中时,我在表中得到了 Null 值;

这是我的代码用户.java

@Entity
@Table
public class User {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@Column(unique = true)
private String username;
private String password;


@OneToMany
private List<Message> messages;

public List<Message> getMessages() {
return messages;
}

public void setMessages(List<Message> messages) {
this.messages = messages;
}

public User() {

}
public User(String userName, String password) {
this.username = userName;
this.password = password;
}


public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}


public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

Message.java

@Entity
public class Message {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

@ManyToOne
private User sender;
private String receiver;
private String content;


@Type(type="timestamp")
private Date created;

public Message() {

}


public Message(String user, String receiver, String content) {
this.sender = sender;
this.receiver = receiver;
this.content = content;
this.created = new Date();
}

public Date getCreated() {
return created;
}

public void setCreated(Date created) {
this.created = created;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public User getSender() {
return sender;
}

public void setSender(User sender) {
this.sender = sender;
}

public String getReceiver() {
return receiver;
}

public void setReceiver(String receiver) {
this.receiver = receiver;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}
}

MessageDAOImpl.java

public class MessageDAOImpl implements MessageDAO {
public static final Logger LOG = LoggerFactory.getLogger(MessageDAO.class);
private static Session session;

private static void beginSession() {
session = DbUtils.getSessionFactory().openSession();
session.beginTransaction();
}

@Override
public void sendMessage(Message message) {
beginSession();
sendMessage(message, session);
session.close();
}

public void sendMessage(Message message, Session session) {
User user = new User();
List<Message> list = new ArrayList<>();
list.add(message);
user.setMessages(list);

try {
session.save(user);
session.save(message);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
LOG.error("Cannot save the message", e);
}
}

主类Solution.java

public class Solution {

public static void main(String[] args) {
// TODO Auto-generated method stub
Message message = new Message("HELP", "HELPER", "PLEASE HELP");
MessageDAOImpl mess = new MessageDAOImpl();
mess.sendMessage(message);
}
}

这会在数据库中创建空条目。

mysql> select * from user;
+----+--------------------------------------------------------------+-------------+
| id | password | username |
+----+--------------------------------------------------------------+-------------+
| 1 | $2a$10$.wjZcxcnyZV45cUhofl7gG64GYoekSOa | testUser123 |
| 2 | NULL | NULL |
| 3 | NULL | NULL |
+----+--------------------------------------------------------------+-------------+

mysql> select * from Message;
+----+-----------------------------+---------------------+---------------------+-----------+
| id | content | created | receiver | sender_id |
+----+-----------------------------+---------------------+---------------------+-----------+
| 1 | This is good | 2017-05-03 11:17:27 | testReceivedFromCfg | NULL |
| 2 | This challenge is good | 2017-05-03 11:28:25 | testReceivedFromCfg | NULL |
| 3 | PLEASE HELP | 2017-05-03 11:35:22 | HELPER | NULL |
+----+-----------------------------+---------------------+---------------------+-----------+

mysql> select * from user_message;
+---------+-------------+
| User_id | messages_id |
+---------+-------------+
| 2 | 2 |
| 3 | 3 |
+---------+-------------+

我的问题是,一个用户可以发送多条消息。如果您直接调用 sendMessage,只有当 User 中存在 senderreceier 时,才应该发送 message。但现在它用 NULL 值填充数据库。如何修改我的代码?

过程是1) 用户使用用户名和密码注册2) 向也在数据库中的接收者发送消息。仅当发送者和接收者在数据库中时才能发送消息。

最佳答案

您的代码似乎有点困惑。首先,您需要连接关系。

消息类

@ManyToOne
@JoinColumn(name="id")
private User sender;

在我的示例中,我通过用户类的 ID 连接了两个实体。您仍然可以在数据库中使用不同的列。

用户类

@OneToMany(mappedBy="sender")
@Fetch(value= FetchMode.JOIN)
private List<Message> messages = null;

添加所需的 cascadeTypes 并根据需要更改 FetchMode。添加其他参数。

DAO

首先,删除所有不属于 DAO 的代码。通常 db-Entry 的更新看起来像这样短:

@Transactional("hibernate")
@Override
public void updateMessage(Message transientObject) throws MyDaoException {
Session session = getCurrentSession();
session.save(message);
}

用户也一样。

关于java - 在数据库中为用户和消息之间的 OneToMany 关系创建 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43767742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com