2017-04-03 62 views
1

我有以下實體Hibernate不持久化對象的所有字段

@Entity 
@Table(name = "Example") 
@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 


public class Example implements Comparable<Example>, Serializable { 


    private static final long serialVersionUID = 1L; 
    @JsonProperty 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    long id; 

    String fieldToPersist; 
} 

其DAO

public class ExampleDAO { 



    public SessionFactory sessionFactory; 
    public Session session; 

    public ExampleDAO(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
     this.session = sessionFactory.openSession(); 
    } 


    @Transactional 
    public void createOrSave(Example ex) { 
     Session session = sessionFactory.openSession(); 
     Transaction tx = session.beginTransaction(); 
     Example exExisting = getById(ex.id); 
     try { 
      if (exExisting != null) { 
       session.merge(ex); 
       tx.commit(); 
      } else { 
       session.save(ex); 
      } 
     } catch (RuntimeException e) { 
      tx.rollback(); 
     } finally { 
      session.close(); 
     } 

    } 

在我的代碼

我設置

example.setFieldToPersist("abc") 
dao.createOrsave(example); 

對於某些原因,這不會持續在da tabase。我看到了對DAO方法的調用,並且在日誌中看到沒有錯誤。但是這個字段沒有保存在數據庫中(雖然保存了對象)

我相信session.merge()調用存在一些問題。如果我刪除它只保存該對象,它會爲該對象創建一個新行,但新的字段將被保存。有什麼我失蹤了嗎?

我還注意到,第一次對對象進行更改並調用createOrSave()方法時,它正確地更新了對象。但將來調用這個方法似乎不會更新它?會話是否過時?日誌是否應該提供一些相關信息?

我還在合併調用之前確認了字段的值,它是新的值。爲什麼這不反映在數據庫中?

我也曾嘗試follwoing方法,而不是合併

session.save() -- creates a new entry in the database with the updated values 
session.update() - no change 
session.saveOrUpdate() -- no change 
session.flush() -- no change 

回答

0

試着改變你的createOrSave方法是這樣的:

@Transactional 
public void createOrSave(Example ex) { 

    Session session = sessionFactory.openSession(); 
    Transaction tx = session.beginTransaction(); 
    //saving the getById on another variable 
    Example managedExample = getById(ex.id); 

    try { 
     if (managedExample != null) { 
      //if the entity exists, just merge 
      session.merge(ex); 

     } else { 
      session.save(ex); 
     } 
     tx.commit(); 
    } catch (RuntimeException e) { 
     tx.rollback(); 
    } finally { 
     session.close(); 
    } 

} 
+0

謝謝,改變它,但是似乎沒有解決這個問題 –

+0

你還可以嘗試致電 '示例ex = getById(ex.id); ' After: 'Transaction tx = session.beginTransaction();' – KuroObi

+0

同樣的問題,嘗試獲取trabsaction後的對象開始 –