Hibernate不会持久保存对象的所有字段

时间:2017-04-03 19:01:15

标签: hibernate jpa merge persistence dropwizard

我有以下实体

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

由于某种原因,这不会在数据库中持续存在。我看到对DAO方法的调用,我发现日志中没有错误。但是此字段未保存在数据库中(尽管保存了对象)

我认为session.merge()电话存在问题。如果我删除它以便它只保存对象,它会为对象创建一个新行但保存新字段。有什么东西我不见了吗?

我还注意到,第一次对对象进行更改并调用createOrSave()方法时,它正确地更新了对象。但未来对这种方法的调用似乎没有更新它?会话是否陈旧?日志应该提供一些信息吗?

我还在调用merge之前验证了字段的值,它是新值。为什么这不会反映在数据库中?

我也尝试过以下方法而不是合并

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

1 个答案:

答案 0 :(得分: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();
    }

}