0

私はHibernate3.2.7.gaを使用していますが、次のことが可能かどうか疑問に思っています。

人、町、市長の3つのオブジェクトがあるとします。

アプリケーションに個人を登録するとき、あなたは彼または彼女の居住地に入るように求められます。このフィールドは文字列として保存されます。

アプリケーションの別の部分では、町を登録できます(名前、住民の数など)。町が登録されたら、この町に市長を追加できます。

ただし、クライアントで入力されるすべての町の町オブジェクトを作成することは望ましくありません。オブジェクトは、市長を登録する必要がある場合にのみ必要です。

PersonのStringフィールドを使用するだけで、Personが住んでいる町の市長を取得できるかどうか疑問に思います。

私はこれらのコード行に沿って考えています:

public class Client.java
{
  @Id
  public Long id;

  @Column(nullable = true, ??? )
  public String townOfResidence;

  public Mayor getMayor()
  {
    ...
  }
}

public class Town.java
{
  @Id
  public Long id;

  @Column(nullable = false, unique = true)
  public String name;

  @OneToOne
  public Mayor mayor;
}

私はちょうど次の線に沿って考えてみました:

@Transient
private Town townObject;

@ManyToOne(fetch = FetchType.LAZY, cascade = javax.persistence.CascadeType.ALL, targetEntity = Town.class, optional = true)
@JoinColumn(referencedColumnName = "town")
public Town getTown()
{
    return townObject;
}

4

2 に答える 2

0

この設計では、クエリを使用して、その人の町の市長を取得する必要があります。

select mayor from Town town
inner join town.mayor mayor
where town.name = :theTownOfResidenceOfTheClient

このクエリは、DAO/Repositoryクラスのメソッドの一部として実行する必要があります。getMayor()市長は、Clientオブジェクトのメソッドで使用できません。

于 2012-09-04T09:22:56.703 に答える
0

これは、ORMの問題というよりもERDの問題です。

Personとの間に関係があるか、関係がないかのどちらかですTown。持っている場合は、参照テーブルのキーにある参照属性の値、またはnull(有効な場合)のみを選択できます。関係がない場合、制限はありません。

もちろん、クエリ/JPQLでそれらを混合しようとするために関係を持っている必要はありません。関係がなければ、あなたのプログラムは、町にTown可能な限りの価値のリストを提供するかもしれません。Personまたはあなたは次のようなことをするかもしれません

 SELECT t FROM Town t WHERE t.name = ?

そしてそこに人の町を渡します。もちろん、それでもnullにならないというセキュリティはありません。

別のアプローチは、2つの列を持つことです。1つは町への参照(nullを許可)として、もう1つはフリーテキストとして使用します。町がテーブルにある場合は参照を使用し、そうでない場合は文字列を使用します。もちろん、これはプログラムロジックをかなり複雑にします。

于 2012-09-04T09:23:59.733 に答える