2016-05-25 2 views
0

私は複数のテーブルに豆のスキーマをマップするSecondaryTableを使用しています:CrudRepositoryで@SecondaryTableを使用するには?

@Entity 
@Table(name = "address1") 
@SecondaryTables({ 
    @SecondaryTable(name="address2") 
}) 

はどのようにして、その後、テーブルaddress2からの値を使用していますRepositoryを作成するために、春を告げますか?

interface AddressRepository extends CrudRepository<Address, Long> { 
    //this one uses address1 
} 

私はその後CrudRepositoryによってのみ二次テーブルを照会できるようにしたいです。しかし、上記のAddressRepositoryを使用してaddress2テーブルをクエリするにはどうすればよいですか?

(アドレステーブルが一種のアーカイブテーブルとみなされますが、そのアドレスがプライマリaddress1テーブルに見つからない場合のみ、address2に照会する必要があります)。

+0

'@ SecondaryTable'の全体のポイントは、エンティティが> 1テーブルにマップされているという事実を隠すことです。アドレスを単独で使用したい場合は、 '@ SecondaryTable'を使用せず、それを' @OneToOne'としてマップしてください。 –

+0

だから、どのようにして 'CrudRepository'を使ってデータを取り出すのかを決めることができますか?または、以前にすべてのセカンダリテーブルに参加しますか? – membersound

+0

私はあなたが何を達成しようとしているのかよく分かりません。あなたのプロフィールを考えれば、驚くべき質問を驚くほど見つけ出します。 –

答えて

1

userテーブルとuser_addressテーブルのようなSecondaryTableを使用して、異なるエンティティに関連するデータを格納する2つのテーブルを表すことができます。あなたがしようとしているのは、同じデータが同じ2つの異なるテーブルに格納されていることです。したがって、SecondaryTableはニーズに合っていません。クラスごとに戦略テーブルを使用して継承アノテーションを使用する必要があります。ここに例があります。

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public abstract class AddressBase { 
    ... 
    ... 
    ... 
} 

@Entity 
@Table(name='address1') 
public class Address1 extends AddressBase {} 

@Entity 
@Table(name='address2') 
public class Address2 extends AddressBase {} 

次に、エンティティごとにリポジトリを作成して、必要な操作を行うことができます。

3

あなたは何を誤解していると思いますか@SecondaryTableです。単一のエンティティを異なるデータベーステーブルに分割する方法です。ドキュメント(http://docs.oracle.com/javaee/7/api/javax/persistence/SecondaryTable.html)から

は、注釈付きエンティティ・クラスのための二次テーブルを指定します。 を指定すると、エンティティ クラスのデータが複数の表にまたがって格納されることが示されます。 SecondaryTable アノテーションが指定されていない場合、エンティティのすべての永続フィールドまたは プロパティがプライマリテーブルにマップされていると見なされます。 プライマリキー結合列が指定されていない場合、結合列はプライマリテーブルのプライマリキー列を参照し、 は プライマリテーブルの参照プライマリキー列と同じ名前と種類を持つとみなされます。

アノテーションは、その現在の状態で、address1テーブルの主キーに結合することによって合成することができるaddress1address2とテーブル内のデータと、Addressエンティティが存在することを言います。

あなたがしたいことを考えて、あなたのCrudRepositoryを上書きせずに動作させるには、別のテーブルを使用するだけです。あなたを正しく理解していれば、どちらのテーブルにも照会する必要があります。

+0

ありがとう洞察私はある種の "アクティブ"と "アーカイブ"テーブルを作成したいと思います。どちらももちろん同じデータ構造を持たなければならず、したがって同じ 'Address'エンティティを持ちます。 'CrudRepository'を使うとき、私はどのテーブルをクエリに選択するかをspringに伝える方法を見つけなければなりません。しかし、どうすれば私はデフォルトで 'address1'を問い合わせることができ、' address2'テーブルに明示的にリダイレクトするのでしょうか? – membersound

+0

@ mememoundound:nsylmzの答えを見てください。各アドレスクラスのリポジトリを作成し、ロジックを実行するカスタムコントローラを作成します。私は、あなたが望む振る舞いを構成することができる場所には何も見つけることができません。かなり一般的なユースケースのように思われるので、おそらくバネデータチームの機能要求です。 – Adam

関連する問題