質問

いくつのサブタイプの連続設定によりどちらのモ?例えばしている場合は、お客様の事業体やクラスのサブクラスTierOneCustomerい場変更の必要なお客様へのTierOneCustomerがTierOneCustomerは同じId(PK)として、お客様の団体をいう。

のマッピングするとどうなるのかわかりません

<class name="Customer" table="SiteCustomer" discriminator-value="C">
  <id name="Id" column="Id" type="Int64">
    <generator class="identity" />
  </id>
  <discriminator column="CustomerType" />
  ... properties snipped ...

  <subclass name="TierOneCustomer" discriminator-value="P">
    ... more properties ...
  </subclass>
</class>

私のテーブルのクラス階層モデル、平野-sqlでいうかがわせるものとなっているsql文を更新に接近検知識別装置(CustomerType)の設定を適切なカラムに関連するタイプです。においては、次の設定によりどちらのモうようお願い申し上げずにポインタ.

たいとも考えているかどうかのモデルが正しいと考えこの場合には、その前に下っているルートを確認して欲しいと述が可能で御座います。ない場合は、もうほぼ確実と思い変更についてのモデルです。

役に立ちましたか?

解決

答えはyesを変更することができます。判別子の値は、特定の列を使用 ネイティブのSQL.

しかし、とは思わない設定によりどちらのモはこれからの接近検知識別装置は一般的に"見えない"におけるクロスプラットがその価値は、初期設定に応じてクラスに続きオブジェクトとまったく変わりませんね。

お勧めしまクリーナーです。の観点からのオブジェクトモデルを行うに変換するにはスーパークラスオブジェクトを一つのサブクラスの種類を変更ではありませんのその続きインスタンスは、このような場合は、もしくは終了することができます(変換されたオブジェクトのようになっている同様のこと).二代替アプローチ:

  • 新しいインスタンスのTierOneCustomerの情報に基づいて、独自の顧客オブジェクトの削除元のオブジェクトです。また頼はお客様の主キーを検索する必要がありますので、新しいPKです。

または

  • 変更のアプローチでは、オブジェクトタイプ(識別子)は必要ありません。に頼るのではなく、サブクラスと区別するTierOneCustomer、お客様から利用できるビルを修正することができ自由に随時、おります。Tier i=1です。

ここではいくつかの議論は、Hibernateのフォーラムに利用:

  1. で更新されていますが、判別子の列Hibernate
  2. Table-per-クラスの問題:判別子および財産
  3. に変換し続インスタンスへのサブクラス

他のヒント

やっている何かが間違っている。

何をしようとしていないの種類を変更するオブジェクトです。できない。純またはJava.るだけではないのです。オブジェクトが同一コンクリートの種類、およびそのコンクリートタイプの変更はできませんから時間のオブジェクトの作成までの時間のオブジェクトが破壊され(ブラックの魔法にかかわらず).そのために何をしようとしていないが、クラス階層のごすためのように破壊するお客様のオブジェクトしたいタスは、お客様のオブジェクトを新規作成段階の一つお客様のオブジェクト、コピーのすべての関連性のお客様からのオブジェクトの段階の一つお客様のオブジェクトです。こんなオブジェクト、オブジェクト指向言語で、クラス上位の階層となります。

当然のことながら、クラス階層ていないかもしれません。んを破壊しのお客様に実することができるような段階の一つです。ないオブジェクトです。代わりに、クラス階層との意味でのシナリオに必要なものするものをいいます。ご利用シナリオを含む:

  • お客様かったな段階の一つの状況は現段階の一つです。

これに必要なクラス階層で的確に捉えてこのシナリオ。をヒントにすべて賛成分以上継承関係を示します。これは、より良いでもらいたいとの想いから名前のプロパティ IsTierOne, は、次の名前のプロパティ DiscountStrategy, 等 によってどの作品です。

全体の目的の設定によりどちらのモ(冬眠のためのJava)のデータベースを見えなくしてしまいます。可能にするために、仕事のオブジェクトでネイティブで、データベースの魔法あり、裏にオブジェ永続します。設定によりどちらのモきるので、データベースのネイティブ、実際にはそうではありませんのタイプのシナリオの設定によりどちらのモ築します。

この後半本当にですが、似た何かを探して次の人に有用でありうるます:

他の回答には、<全角>ことは、ほとんどの場合、弁別を変更すべきではありませんが正しいですが、

は、が、それは純粋にNHの範囲内(ネイティブSQL)を行うことができます<全角> 、マップされたプロパティのいくつかの巧妙な使用を有します。ここでFluentNHを使用して、それの要旨だ。

public enum CustomerType //not sure it's needed
{
   Customer,
   TierOneCustomer
}

public class Customer
{
   //You should be able to use the Type name instead,
   //but I know this enum-based approach works
   public virtual CustomerType Type 
   { 
      get {return CustomerType.Customer;} 
      set {} //small code smell; setter exists, no error, but it doesn't do anything.
   }
   ...
}

public class TierOneCustomer:Customer
{
   public override CustomerType Type {get {return CustomerType.TierOneCustomer;} set{}}
   ...
}

public class CustomerMap:ClassMap<Customer>
{
   public CustomerMap()
   {
      ...
      DiscriminateSubClassesOnColumn<string>("CustomerType");
      DiscriminatorValue(CustomerType.Customer.ToString());
      //here's the magic; make the discriminator updatable
      //"Not.Insert()" is required to prevent the discriminator column 
      //showing up twice in an insert statement
      Map(x => x.Type).Column("CustomerType").Update().Not.Insert();
   }
}

public class TierOneCustomerMap:SubclassMap<TierOneCustomer>
{
   public CustomerMap()
   {
      //same idea, different discriminator value
      ...
      DiscriminatorValue(CustomerType.TierOneCustomer.ToString());
      ...
   }
}

最終結果は、ディスクリミネータ値を挿入するために指定され、検索でインスタンスタイプを決定するために使用されるが、同じIDを持つ異なるサブタイプのレコードを(保存されている場合、レコードをクローニングまたは未したかのようにされていることですそのタイプの将来回収の新しいオブジェクトようになるように結合型新しいタイプのUI)から、判別値は、オブジェクトのプロパティとしてそのIDを持つ既存のレコードに更新されます。私の知る限りNHibernateのプロパティを読み取り専用(したがって、「書き込み専用」DBに)されていることを伝えることができないので、セッターが特性に必要とされます。あなたがDBに何かを書く場合にNHibernateの世界で、なぜあなたはそれをバックたくはないでしょうか。

私は最近、ユーザーが実際の「ツアー」のスケジュールを管理する規則のセットが現実にある「ツアー」、の基本的なタイプを変更できるようにするには、このパターンを使用(単一のデジタルがクライアントの上に「訪問」それはすべて)が正常に動作することを確認するために-site機器。彼らはすべての「ツアーのスケジュール」だとのようなリスト/キューなどで収集可能である必要がありますが、スケジュールの異なるタイプがOPが持っている同様のデータ構造を呼びかけ、非常に異なるデータと非常に異なる処理を必要とします。したがって、私は完全にここ屋に行く、データ層に影響を最小限に抑えながら、実質的に異なる方法でTierOneCustomerを治療するために、OPの欲求を理解し、とてもます。

あなたが(例えばDBのアップグレードスクリプトで)オフラインでそれをやっている場合は、単にSQLを使用し、一貫性を自分で確認してください。

アプリが実行されている間、これはあなたが計画するものですが、中に発生する場合は、

、私はあなたの要件が異なるオブジェクトに対して同じポインタアドレスを維持することは間違っているだけのような、間違っていると思います。

あなたがIDを保存し、再び顧客にアクセスするためにそれを使用している場合(例えばURLで)ビジネスキーになります。このためにトークンを含む新しいフィールドをすることを検討してください。それはIDはありませんので、それは(おそらく古いものからトークンを削除する必要があります)新しいエンティティインスタンスを作成し、トークンをコピーするのは簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top