jpa-derby 布尔合并
jpa-derby Boolean merge
我正在使用 JPA(EclipseLink) 和 Derby。在我的对象中有一个布尔字段。在合并操作之前,该字段设置为 true。但合并后,该字段仍然持有假值。
@Entity
@Access(AccessType.PROPERTY)
public class SleepMeasure extends AbstractEntity {
private static final long serialVersionUID = 1361849156336265486L;
...
private boolean WeatherDone;
public boolean isWeatherDone() { // I have already tried with the "getWeatherDone()"
return WeatherDone;
}
public void setWeatherDone(boolean weatherDone) {
WeatherDone = weatherDone;
}
...
}
好像无所谓,我用"getWeatherDone()"还是"isWeatherDone()"。
使用代码:
public class WeatherDataCollectorImpl{
...
private void saveMeasures(WeatherResponse mResponse, SleepMeasure sleep) throws Exception {
AppUser owner = sleep.getOwner();
...
sleep.setWeatherDone(Boolean.TRUE);
reposService.updateEntity(sleep,SleepMeasure.class);
}
...
}
这是我的存储库 class
public class RepositoryImpl{
...
public <T extends AbstractEntity> T updateEntity(T entity, Class<T> type) throws RepositoryException {
openEM();
EntityTransaction tr = em.getTransaction();
try {
tr.begin();
{
// entity.weatherdone has value true
entity = em.merge(entity);
// entity.weatherdone has value false
}
tr.commit();
} catch (Exception e) {
tr.rollback();
}
return entity;
}
...
}
JPA 控制台信息:没有错误,也没有警告,甚至没有任何关于应更新布尔列的信息。
--Merge clone with references com.sleepmonitor.persistence.entities.sleep.SleepMeasure@b9025d
...
--Register the existing object // other objects
...
--Register the existing object com.sleepmonitor.persistence.entities.sleep.SleepMeasure@1ba90cc
那么我该如何解决这个小问题。
注意:
Derby 将此字段定义为 "SMALLINT".
谢谢。
天呐!我发现了我的问题。实际上我意识到,它不仅是布尔字段,而且整个对象都无法更新。
在尝试完成双向引用时,我愚蠢地在 setter 属性 而不是 addMethod() 中执行了此操作。
public void setSleepProperties(SleepProperties sleepProperties) {
this.sleepProperties = sleepProperties;
if (!(sleepProperties == null)) {
this.sleepProperties.setSleepMeasure(this);
}
}
而不是:
public void addSleepProperties(SleepProperties sleepProperties) {
this.sleepProperties = sleepProperties;
if (!(sleepProperties == null)) {
this.sleepProperties.setSleepMeasure(this);
}
}
所以我最终在合并前用引用的实体 (sleepProperties.sleepMeasure) 覆盖了拥有实体的更新。这很难找到,我认为从中吸取了很大的教训。感谢所有试图帮助我的人。
"addMethod()" 解决了我的问题。
我正在使用 JPA(EclipseLink) 和 Derby。在我的对象中有一个布尔字段。在合并操作之前,该字段设置为 true。但合并后,该字段仍然持有假值。
@Entity
@Access(AccessType.PROPERTY)
public class SleepMeasure extends AbstractEntity {
private static final long serialVersionUID = 1361849156336265486L;
...
private boolean WeatherDone;
public boolean isWeatherDone() { // I have already tried with the "getWeatherDone()"
return WeatherDone;
}
public void setWeatherDone(boolean weatherDone) {
WeatherDone = weatherDone;
}
...
}
好像无所谓,我用"getWeatherDone()"还是"isWeatherDone()"。
使用代码:
public class WeatherDataCollectorImpl{
...
private void saveMeasures(WeatherResponse mResponse, SleepMeasure sleep) throws Exception {
AppUser owner = sleep.getOwner();
...
sleep.setWeatherDone(Boolean.TRUE);
reposService.updateEntity(sleep,SleepMeasure.class);
}
...
}
这是我的存储库 class
public class RepositoryImpl{
...
public <T extends AbstractEntity> T updateEntity(T entity, Class<T> type) throws RepositoryException {
openEM();
EntityTransaction tr = em.getTransaction();
try {
tr.begin();
{
// entity.weatherdone has value true
entity = em.merge(entity);
// entity.weatherdone has value false
}
tr.commit();
} catch (Exception e) {
tr.rollback();
}
return entity;
}
...
}
JPA 控制台信息:没有错误,也没有警告,甚至没有任何关于应更新布尔列的信息。
--Merge clone with references com.sleepmonitor.persistence.entities.sleep.SleepMeasure@b9025d
...
--Register the existing object // other objects
...
--Register the existing object com.sleepmonitor.persistence.entities.sleep.SleepMeasure@1ba90cc
那么我该如何解决这个小问题。
注意: Derby 将此字段定义为 "SMALLINT".
谢谢。
天呐!我发现了我的问题。实际上我意识到,它不仅是布尔字段,而且整个对象都无法更新。 在尝试完成双向引用时,我愚蠢地在 setter 属性 而不是 addMethod() 中执行了此操作。
public void setSleepProperties(SleepProperties sleepProperties) {
this.sleepProperties = sleepProperties;
if (!(sleepProperties == null)) {
this.sleepProperties.setSleepMeasure(this);
}
}
而不是:
public void addSleepProperties(SleepProperties sleepProperties) {
this.sleepProperties = sleepProperties;
if (!(sleepProperties == null)) {
this.sleepProperties.setSleepMeasure(this);
}
}
所以我最终在合并前用引用的实体 (sleepProperties.sleepMeasure) 覆盖了拥有实体的更新。这很难找到,我认为从中吸取了很大的教训。感谢所有试图帮助我的人。
"addMethod()" 解决了我的问题。