0

私は yo'll ole google で 2 時間を費やしましたが、成功しませんでした。

私はmysqlとJava EE(Restletフロント付き)でApache Mavenを使用しています。

ID属性を指定してオブジェクトを取得し、更新してデータベースに保存しようとしています。私はこの答えをここで見ましたが、うまくいきません!

こちらのドキュメントも読みました。

データ横断の順序で、JSON オブジェクトを受け入れ、それをオブジェクトのコンストラクターにフィードし、オブジェクトを構築し、新しいオブジェクト (JSON オブジェクトとは関係ありません) を取得し、ID を指定してデータを入力し、2 つのオブジェクトを結合して保存します。データベースに。

データベースを更新するコードは次のとおりです。

ObjectContext context = DataContext.createDataContext();
ObjectId idObject = new ObjectId("Vessel", Vessel.ID_PK_COLUMN, id);
ObjectIdQuery query = new ObjectIdQuery(idObject, false, ObjectIdQuery.CACHE_REFRESH);
Vessel v = (Vessel) DataObjectUtils.objectForQuery(context, query); //<-- This is our current vessel in the database.
v.updateVessel(new Vessel(json)); //<-- this calls the method below
context.commitChanges();

public vehicle(JSONObject json) - 使用されている容器のコンストラクタ

public Vessel(JSONObject json)
{
  Iterator<String> keysIterator = json.keySet().iterator();
  while (keysIterator.hasNext()) 
  {
    String key = keysIterator.next();
    this.values.put(key, json.get(key));
  }
}

vehicle.update(Vessel v) - これは私が使用している更新方法です

public void updateVessel(Vessel v)
{
  for (Map.Entry pairs : v.values.entrySet()) {
    if(pairs.getValue() != null)
    {
      //okay it's not null, lets validate
      Object o = pairs.getValue();
      if(o instanceof String || o instanceof Double || o instanceof Integer || o instanceof Float || o instanceof Boolean)
      {
        //okay the value is of valid type
        this.values.put(pairs.getKey().toString(), o);
      }
    }
  }
}

これらのループを使用して変数を格納することの大きなセキュリティ リスクを認識しています。ただし、これにより開発時間が大幅に短縮されます。実際に使用されていない変数を渡すとどうなるかはテストしていませんが、保存されるだけだと思います。いずれにせよ、それは私の質問ではないので、ここで持ち出さないでください (私にメッセージを送ってください!)。

v.setSomething("awesome")呼び出す代わりに実行するとv.update(...)、コードは期待どおりに機能します(上記の回答で最初に見つかりました)。

アイデアはありますか?ヘルプは非常に、非常に、非常に高く評価されています!

編集:(約1時間後)

に変更することで、これを機能させることができました(これまでのところ、テストを終了する必要があります)this.values.put(pairs.getKey().toString(), o);this.writeProperty(pairs.getKey().toString(), o);

検証したらまた報告します…

4

1 に答える 1

0

上記の私の編集で問題が解決したようです。CayenneDataObject のソースコードを見つけようとしましたが成功しませんでした。writeProperty()マップを更新する以外のコードを実行するため、これで問題が解決したとしか思えませんthis.values

の下の作業コードは次のとおりvessel.update()です。

public void updateVessel(Vessel v)
{
  for (Map.Entry pairs : v.values.entrySet()) {
    if(pairs.getValue() != null)
    {
      //okay it's not null, lets validate
      Object o = pairs.getValue();
      if(o instanceof String || o instanceof Double || o instanceof Integer || o instanceof Float || o instanceof Boolean)
      {
        //okay the value is of valid type
        this.writeProperty(pairs.getKey().toString(), o);
      }
    }
  }
}
于 2014-06-05T15:01:36.963 に答える