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

Java 在数据库中为用户和消息之间的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

我试图在用户类和消息类之间创建一个OneToMany关系。一个用户可以有多条消息。但是当我将它持久化到db中时,我在表中得到空值

这是我的密码 User.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);
    }
}
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()或查询),然后将其传递给消息构造函数。