jpa-derby布尔合并

时间:2016-07-14 06:46:05

标签: jpa derby

正在使用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);
    }
    ...
}

这是我的存储库类

    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将此字段定义为&#34; SMALLINT&#34;。

感谢。

1 个答案:

答案 0 :(得分:1)

天啊!我发现了我的问题。实际上我意识到,它不仅是布尔字段,而且整个对象无法更新。 在尝试完成双向引用时,我愚蠢地在setter属性中执行此操作而不是addMethod()。

<html>
<head>
	<title>Corner Circle Menu</title>
</head>
<body>
	<div class="menu">
		<div class="menu-btn">Menu</div>
	</div>
	<div class="menu-items">
		<div class="menu-item">Item 1</div>
		<div class="menu-item">Item 2</div>
		<div class="menu-item">Item 3</div>
	</div>
</body>
</html>

而不是:

public void setSleepProperties(SleepProperties sleepProperties) {
    this.sleepProperties = sleepProperties;
    if (!(sleepProperties == null)) {
        this.sleepProperties.setSleepMeasure(this);
    }
}

所以我最终使用引用的实体(sleepProperties.sleepMeasure)在合并之前覆盖了拥有实体上的更新。这是非常有效的发现,我认为从中学到了很多教训。感谢所有试图帮助我的人。

&#34; addMethod()&#34;解决了我的问题。