我有以下实体
@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
答案 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();
}
}