2017-04-03 4 views
1

I持って、次のエンティティ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私は

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

を設定

私のコードで

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

    } 

これがダーに残らない何らかの理由タベース。私は呼び出しがDAOメソッドに行われているのを見て、ログにエラーは見られません。しかし、このフィールドはデータベースに保存されません(オブジェクトは保存されます)

私はsession.merge()呼び出しに何らかの問題があると考えています。オブジェクトを保存するだけで削除すると、オブジェクトの新しい行が作成されますが、新しいフィールドが保存されます。私が紛失しているものがありますか?

私は、オブジェクトを初めて変更してcreateOrSave()メソッドを呼び出すと、オブジェクトを正しく更新することに気付きました。しかし、このメソッドへの将来の呼び出しはそれを更新するように見えない??セッションは古くなってしまいますか?ログはこれに関するいくつかの情報を与えるべきですか?

また、mergeの呼び出しの直前のフィールドの値を検証し、新しい値にしました。なぜこれがデータベースに反映されていないのですか?

は、私はまた、follwoing方法を試してみました代わりに、このような何かにあなたのcreateOrSave方法を変更してみてください

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

をマージ:

@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

おかげで、それを変更しましたが、それdoesntの問題 –

+0

を修正するように見えます 'ex = getById(ex.id);を呼び出すこともできます。 ' 後: 'トランザクションTX = session.beginTransaction(); ' – KuroObi

+0

同じ問題、trabsactionは –

関連する問題