2015-10-30 217 views
0

我正在做一對多的映射沒有成功。我的模式是如下休眠一對多

事件(一個)---->消息(多)

在事件文件的獲取/設置信息功能:

@Entity 
@Table(name = "event", schema = "public") 
@SuppressWarnings("serial") 
public class Event implements java.io.Serializable { 
    ... 
    ....  
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "event") 
    public Set<Message> getMessages() { 
    return this.messages; 
    } 

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

了get/set消息功能消息文件:

@Entity 
@Table(name = "message", schema = "public") 
@SuppressWarnings("serial") 
public class Message implements java.io.Serializable { 
    ... 
    .... 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "event_id", nullable = false) 
    public Event getEvent() { 
      return this.event; 
    } 

    public void setEvent(Event event) { 
      this.event = event; 
    } 
} 

而Hibernate配置文件:

... 
<mapping class="org.itri.ccma.paas.hibernate.Event" /> 
<mapping class="org.itri.ccma.paas.hibernate.Message" /> 

執行以下BoEvent.java

... 
Session session = HibernateUtil.getSessionFactory().openSession(); 
     Transaction tx = null; 
     try { 
      tx = session.beginTransaction(); 

      Event event = new Event(); 
      session.save(event); 

      Set<Message> Messagess = new HashSet<Message>(); 

      Message testMessage = new Message(); 
      testMessage.setEvent(event); 

      event.getMessages().add(testMessage); 
      session.save(event); 
      tx.commit(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      tx.rollback(); 


     } finally { 
      session.close(); 
     } 

後有一個在我的留言表中沒有記錄,但事件表是確定。 我想我在代碼中丟失了一些東西

有什麼建議嗎?

+1

您的課堂是否註釋爲@實體?你註釋過你的類是「@Access(AccessType.PROPERTY)'嗎? – SWiggels

+0

我想我已經將我的課程註釋爲@Entity。 –

+0

但是我應該在哪裏放置@access,事件或消息或兩者兼而有之? –

回答

0

你必須將它添加到使用屬性的訪問意味着@ManyToOne(fetch = FetchType.LAZY)上的方法簽名像你這樣的頂部每個實體。並添加序列號。

@Entity 
@Table(name = 'message') 
@Access(AccessType.PROPERTY) 
public class Message extends BusinessEntity { 

private static final long serialVersionUID = 1L; 

} 

@Entity 
@Table(name = 'event') 
@Access(AccessType.PROPERTY) 
public class Event extends BusinessEntity { 

private static final long serialVersionUID = 1L; 

} 

你可以有@Access(AccessType.PROPERTY)@Access(AccessType.Field)不同的是,在這裏你註釋@ManyToOne(@OneToMany,@OneToOne)。屬性訪問意味着您在方法簽名之上設置這些註釋。場地訪問意味着你將自己置於場地的頂部。

,如:

@Entity 
@Table(name = 'event') 
@Access(AccessType.PROPERTY) 
public class Event extends BusinessEntity { 

private static final long serialVersionUID = 1L; 

private Message message; 

@ManyToOne 
public Message getMessage(){ return message;} 
//setter 
} 

@Entity 
@Table(name = 'event') 
@Access(AccessType.Field) 
public class Event extends BusinessEntity { 

private static final long serialVersionUID = 1L; 

@ManyToOne 
private Message message; 

public Message getMessage(){ return message;} 
//setter 
} 

進口:

import javax.persistence.Access; 
import javax.persistence.AccessType; 
import javax.persistence.Entity; 
import javax.persistence.Table; 

正如有人提到你可能會得到一個NPE:如果想保存級聯

Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 

     Event event = new Event(); 
     session.save(event); 

     Message testMessage = new Message(); 
     testMessage.setEvent(event); 
     event.setMessages(new HashSet<Message>()); //the list was not initialized. 
     event.getMessages().add(testMessage); 
     session.save(event); 
     tx.commit(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     tx.rollback(); 


    } finally { 
     session.close(); 
    } 

@ManyToOne 
    @Cascade({ org.hibernate.annotations.CascadeType.ALL }) 
    public Message getMessage(){ return message;} 
+0

修改代碼後,我有編譯錯誤:AccessType無法解析爲變量。你有什麼主意嗎? –

+0

我已經添加了我的導入。 – SWiggels

+0

非常感謝。我已將它添加到我的代碼中。但消息表仍然是空的:( –

0

請嘗試下面的代碼。似乎你正在得到一個NullPointerException

Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try { 
     tx = session.beginTransaction(); 

     Event event = new Event(); 
     session.save(event); 

     Set<Message> messages = new HashSet<Message>(); 

     Message testMessage = new Message(); 
     testMessage.setEvent(event); 

     messages.add(testMessage); // This 
     event.setMessages(messages); // This 
     session.save(event); 
     tx.commit(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     tx.rollback(); 


    } finally { 
     session.close(); 
    } 
+0

謝謝你的回覆。我修改了我的代碼,就像這個一樣。但結果是一樣的。我的消息表中仍然沒有任何信息 –

0

基於SWiggels說: BTW您保存活動兩次,但你永遠不保存您的消息 - SWiggels

我修改了代碼:

... 
... 
    Message testMessage = new Message(); 
    testMessage.setEvent(event); 
    event.getMessages().add(testMessage); 

    session.save(testMessage); // Here I modified 
    tx.commit(); 

最後得到正確的結果。感謝SWiggels!

0

我的消息表中沒有記錄,但事件表正常。我認爲 我在我的代碼中缺少某些東西

因爲您沒有堅持testMessage對象。

爲什麼要堅持事件對象兩次?你不應該堅持testMessage對象。

 Event event = new Event(); 
     session.save(event); 

     Set<Message> Messagess = new HashSet<Message>(); 

     Message testMessage = new Message(); 
     testMessage.setEvent(event); 

     event.getMessages().add(testMessage); 
     session.save(testMessage); //save testMessage rather than event 
     tx.commit();