2016-07-14 8 views
0

JPA(EclipseLink)とDerbyで作業しています。私のオブジェクトにはブール値のフィールドがあります。マージ操作の前に、フィールドはtrueに設定されます。マージ後、フィールドは依然としてfalse値を保持します。jpa-derbyブールマージ

@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 [email protected] 
... 
--Register the existing object // other objects 
... 
--Register the existing object [email protected] 

この小さな問題を解決するにはどうすればよいですか。

注: Derbyはこのフィールドを「SMALLINT」と定義しました。

ありがとうございました。

+0

エンティティの完全なコードを表示します。 –

+0

ログは何を言いますか?あなたは、呼び出されたSQLを見てください... –

+0

@JB Nizet、私は私のコードの最も重要な部分で私の質問を更新しました。 –

答えて

1

Oh God!私は自分の問題を見つけました。実際に私は、ブール値フィールドだけでなく、オブジェクト全体を更新できないことに気付きました。 双方向参照を完了しようとしている間、私は愚かにaddMethod()ではなくsetterプロパティでこれを行いました。

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()"は私の問題を解決しました。