2017-05-03 34 views
2

之間一對多的關係,我想創建一個User類和消息類之間的一對多關係。用戶可以有多個消息。但是,當我在分貝堅持它,我得到的表格中的空值;創建的數據庫NULL值的用戶和消息

這裏是我的代碼 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; 
    } 

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); 
     } 
    } 

MainClass 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 | 
+---------+-------------+ 

我的問題是,用戶可以發送多條消息。如果你直接調用sendMessagemessage應該發送只有senderreceier存在於User table。但是現在它用NULL值填充數據庫。我如何修改我的代碼?

過程是 1) The user registers with username and password2) Sends message to receiver who is also in the db. 消息可以僅當發送者和接收者是分貝發送。

+1

閱讀有關如何創建雙向一對多關聯的文檔。這不是你在這裏所擁有的。你有兩個單向關聯,每個關聯映射不同(一個使用連接表user_message,一個使用連接列sender_id)。 HTTPS://docs.jboss。組織/休眠/ ORM /電流/ userguide/html_single/Hibernate_User_Guide.html#協會 - 一個一對多雙向。這與閱讀文檔非常簡單。 –

+0

但是,當我在我的'Message構造函數'中傳遞'String sender'時,它將用戶視爲NULL。我該如何解決它? – Newbie

+0

在Message構造函數中根本沒有發送者參數。您需要創建User,然後將創建的用戶傳遞給Message的構造函數。 –

回答

0

您的代碼似乎有點混淆。首先你需要連接關係。

消息類別

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

在我的例子我通過用戶類的id兩個實體連接。你仍然可以在你的數據庫中使用不同的列。

User類

@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); 
} 

對用戶也一樣。