Java 在数据库中为用户和消息之间的OneToMany关系创建空值
我试图在用户类和消息类之间创建一个OneToMany关系。一个用户可以有多条消息。但是当我将它持久化到db中时,我在表中得到空值 这是我的密码 User.javaJava 在数据库中为用户和消息之间的OneToMany关系创建空值,java,mysql,hibernate,Java,Mysql,Hibernate,我试图在用户类和消息类之间创建一个OneToMany关系。一个用户可以有多条消息。但是当我将它持久化到db中时,我在表中得到空值 这是我的密码 User.java @Entity @Table public class User { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; @Column(unique = true) private String us
@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;
}
@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;
}
}
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);
}
}
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);
}
}
MessageDAOImpl.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;
}
@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;
}
}
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);
}
}
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
,则只有sender
和receier
出现在用户表中时,才应发送消息。但是现在它用空值填充数据库。如何修改我的代码
过程是
1)用户使用用户名和密码注册
。
2)将消息发送给数据库中的接收者。
只有当发送方和接收方在db中时,才能发送消息 您的代码似乎有点混乱。首先,你需要连接关系
消息类
@ManyToOne
@JoinColumn(name="id")
private User sender;
@OneToMany(mappedBy="sender")
@Fetch(value= FetchMode.JOIN)
private List<Message> messages = null;
在我的示例中,我通过用户类的id连接这两个实体。您仍然可以在数据库中使用不同的列
用户类
@ManyToOne
@JoinColumn(name="id")
private User sender;
@OneToMany(mappedBy="sender")
@Fetch(value= FetchMode.JOIN)
private List<Message> messages = null;
用户也一样 阅读有关如何创建双向一对多关联的文档。这不是你这里的东西。您拥有的是两个单向关联,每个映射方式不同(一个使用联接表用户\消息,一个使用联接列发送者\ id)。它实际上和阅读文档一样简单。但是,当我在我的消息构造函数中传递字符串发送者
时,它将用户视为NULL。如何修复它?在消息构造函数中根本没有发件人参数。您需要创建用户,然后将创建的用户传递给消息的构造函数。如何在不创建用户的情况下传递消息?。过程是1)用户使用用户名和密码注册。2) 将消息发送给数据库中的接收者。因此,是否要为数据库中已存在的用户创建消息?从数据库中获取它(使用em.find()或em.getReference()或查询),然后将其传递给消息构造函数。