1

Java EE JSP/EJB3 を使用していますが、テーブル間のリレーションの実装に問題があります。最初はIDを保存することを考えていましたが、オブジェクトへの参照を保存するEJBの目的を無効にすることを読んだことがあります

私の問題を説明するためのテスト例として、車のモデルと車のブランドの関係を考え出しました。この Web アプリケーションでは、ユーザーは最初にブランドを作成します。次に車を作成し、ドロップダウンからブランドを選択します。

車 -> ランド: 多対 1 ブランド -> 車: 1 対多

public class Brand implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="id")
  private long id;

  @Column(name="brand_name")
  private String brand_name;

  @Column(name="cars_fk")
  private Set<Car> cars;
...

}

以下は車のEntitybeanです

public class Car implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="id")
  private long id;

  private Brand brand;

  @ManyToOne(fetch = FetchType.LAZY)
  @Column(name="brand_FK")
  private Brand brand;
...

}

上記が正しいことを考えると(私にはわかりません)

これらの入力を処理するためのベストプラクティスは何ですか

私はこのhtmlを持っているとしましょう(選択が異なる必要がある場合は教えてください)

<form action="processCar.jsp">
  Model: <input type="text" name="title"><br>

  <select>
    <option value="volvo">Volvo</option>
    <option value="saab">Saab</option>
    <option value="mercedes">Mercedes</option>
    <option value="audi">Audi</option>
  </select> 

  <input type="submit" value="Submit">
</form> 

ブランド オプションは、Brand.findAll から読み込まれます。

また、これが正しい場合、ブランド名/ID からエンティティ オブジェクト Brand への変更はどこで行われますか? セッション Bean で ?

public void createCar(String title,String brandname){
   Query query = em.createNamedQuery("Brand.getBrandbyName");
   query.setParameter("brand_name", brandname);
   Brand brand = (Brand)query.getSingleResult();
   carSLSBManagement.create(title,brand);
}

前もって感謝します

4

1 に答える 1

0

これを行う通常の方法は、ID をドロップダウンの値として使用し、リクエストを受け取るコードでできるだけ早くそれをオブジェクトに変換することです。これは、Bean ではなく、サーブレットまたは同等のものになります。Bean は、すでにフェッチされているオブジェクトで動作する必要があります。

ブランドの ID を持っている場合、取得は次のように簡単です。

long brandId = Long.parseLong(request.getParameter("brandId"));
Brand brand = em.find(Brand.class, brandId);

私は、すべてのパラメーターの解析とデコードを Web レイヤーで行うことを好みますが、ドメイン レイヤーに移動する前に、技術的な理由から、その一部をドメイン レイヤーにプッシュする方が便利な場合があることを付け加えておきます。たとえば、 を実行するときはトランザクションを開いておく必要があります。em.findサーブレットと EJB で従来の Java EE アーキテクチャを使用している場合、トランザクションは当然 EJB で開始され、サーブレットは非トランザクションになります。それに合わせて、サーブレットで ID を long に解析し、EJB でオブジェクトをフェッチすることができます。これは少し扱いに​​くいですが、トランザクションをいじる必要がないことを意味します。

于 2012-11-26T08:30:45.117 に答える