jpa-derby 布尔合并

Posted

技术标签:

【中文标题】jpa-derby 布尔合并【英文标题】:jpa-derby Boolean merge 【发布时间】:2016-07-14 06:46:04 【问题描述】:

我正在使用 JPA(EclipseLink) 和 Derby。在我的对象中有一个布尔字段。在合并操作之前,该字段设置为 true。但合并后,该字段仍为 false 值。

@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 将此字段定义为“SMALLINT”。

谢谢。

【问题讨论】:

向我们展示实体的完整代码。 日志说什么?你知道的,看看调用的 SQL ... @JB Nizet,我已经用我的代码中最重要的部分更新了我的问题。 @Neil,我还粘贴了有关要更新的对象“SleepMeasure”的 JPA cmets。没有错误或警告,甚至没有任何应该更新列的信息。 为什么你的变量以大写开头?标准 Java Beans 意味着“weatherDone”和 getWeatherDone/setWeatherDone 【参考方案1】:

天哪!我发现了我的问题。实际上我意识到,它不仅是布尔字段,而且整个对象都无法更新。 在尝试完成双向引用时,我愚蠢地在 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-derby 布尔合并的主要内容,如果未能解决你的问题,请参考以下文章

7月新的开始 - Axure学习03 - 布尔运算表单元件

将多个 Amazon Redshift 表合并到一个表中会出现错误:列 X 的类型为布尔值,但表达式的类型为字符变化提示:

ledit布尔运算完怎么查看单个的object

Python 2d 数组布尔减少

solr 中的布尔子句异常过多

那些属于布尔类型??