100 個のテーブル (エンティティ クラス) と 100 個のスクリーン (それぞれに 1 つ) がある状況にあります。ShipviaTopComponent と RouteTopComponent の 2 つの画面を見てみましょう。RouteTopComponent には次のメソッドがあります。
public static void saveRecord() {
Route r = resultList.get(currentPos);
EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager();
entityManager.getTransaction().begin();
r = entityManager.find(Route.class, r.getRouteKey());
r.setRoute(txtRoute.getText());;
entityManager.persist(r);
entityManager.getTransaction().commit();
}
このメソッドを 100 個の画面のそれぞれに配置すると、すべてが機能します。ただし、それを独自のクラスに抽出することを検討しています。つまり、常にルートになるとは限りませんが、Shipvia またはその他のエンティティ クラスになる可能性があります。
RouteTopComponent が次のように呼び出すことを期待しています。
com.demo.viewer.SaveRecord.SaveRecord(r);
その r には、私が必要とするほぼすべてのものが含まれています。これが SaveRecord クラスです。
public class SaveRecord {
public static void saveRecord(entity.Route r) {
EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager();
entityManager.getTransaction().begin();
r = entityManager.find(Route.class, r.getRouteKey());
r.setRoute("01-banana"); //Hardcode this for now
entityManager.persist(r);
entityManager.getTransaction().commit();
}
私が抱えている問題の1つ-「r」を渡すと、エンティティ.ルートが期待されます。でもシップビアを通り過ぎると壊れる。entity.Anything のようなものを期待できるいくつかの方法は何ですか
編集:提案に従って、スーパークラス エンティティを作成しようとしています。
スーパークラス AddChg エンティティ - http://pastebin.com/1iW67NVn
Shipvia エンティティ - http://pastebin.com/R53tNHyp (オリジナルの通常のエンティティ)
ルート エンティティ - http://pastebin.com/5DCvj340 (AddChg を拡張)
SaveRecord のコード (私は SaveResult と名付けました) は次のようになります。
public static <T extends AddChg> void SaveResult(T r) {
EntityManager entityManager = Persistence.createEntityManagerFactory(
"EntityLibraryPU").createEntityManager();
entityManager.getTransaction().begin();
r = entityManager.find(Route.class, r.getId());
r.setSomething("01-banana");
entityManager.persist(r);
entityManager.getTransaction().commit();
}
今、ある意味ではうまくいくようです。スーパークラスからすべてを引き出します。私に問題を引き起こしているように見えるのは1行だけです:
r = entityManager.find(Route.class, r.getId());
Route.class は、アクセスしようとしているエンティティによっても異なる必要があります。そして、r.getId()
保存されているエンティティの PK でなければなりません。
たとえば、ユーザーが RouteTop Screen を編集したい場合、行は次のようになります。
r = entityManager.find(Route.class, r.getRouteKey());
ただし、ShipviaTopScreen の場合は次のようになります。
r = entityManager.find(Shipvia.class, r.getShipvViaCd());
次のようなパラメーターとしてそれらを渡すことができますか?
public static <T extends AddChg> void SaveResult(T r, Class c, String PK)
Edit3:上記の解決策は機能しますが、最後に最後の問題/質問があります。
保存結果:
public static <T extends AddChg> void SaveResult(T r, Class c, String pk) {
EntityManager entityManager = Persistence.createEntityManagerFactory(
"EntityLibraryPU").createEntityManager();
entityManager.getTransaction().begin();
r = entityManager.find(c, pk);
r.setSomething("01-banana");
entityManager.persist(r);
entityManager.getTransaction().commit();
}
RouteTopComponent:
public static void saveRecord() {
if (r.getRouteKey() != null) {
r.setRoute(txtRoute.getText());
}
SaveResult.SaveResult(r, Route.class, r.getRouteKey());
}
問題は、r.setSomething("");
r と入力したときです。私の唯一の提案はスーパークラスのものです(この質問については、ペーストビンのリンクを参照する必要があります)。
RouteTopComponent ではできますr.setRoute
が、SaveResult =( ではできません
Edit4:汎用 (共通) フィールドをスーパークラスに残しながら、エンティティ固有のデータを TopComponent に保存するアプローチを追求しました。私のコードは次のようになります。
RouteTopComponent:
public static void saveRecord() {
WWEntityManager.entityManager.getTransaction().begin();
r = WWEntityManager.entityManager.find(Route.class, r.getRouteKey());
r.setRoute(txtRoute.getText());
WWEntityManager.entityManager.persist(r);
WWEntityManager.entityManager.getTransaction().commit();
SaveResult.SaveResult(r, Route.class, r.getRouteKey());
}
ご覧のとおり、Route.class 固有のフィールドを最初にコミットしています。次に、一般的な内容を保存する SaveResult メソッドを呼び出します。
結果の保存
public class SaveResult {
public static <T extends AddChg> void SaveResult(T r, Class c, String pk) {
WWEntityManager.entityManager.getTransaction().begin();
r = (T) WWEntityManager.entityManager.find(c, pk);
r.setChgDate("2012-05-31");
WWEntityManager.entityManager.persist(r);
WWEntityManager.entityManager.getTransaction().commit();
}
}
それが実際に単一のレコードを保存する方法であるかどうか(2つのコミットで)疑問に思っていますか?それは機能しますが、それを処理する方法についてより良い練習があれば、それはかなり素晴らしいでしょう!