2016-08-20 10 views
0

私は多対1(一対多)の関係を持つ2つのエンティティを持っています。エンティティ間のJPA関係。どのように関係テーブルからいくつかのフィールドだけをDBから取るようにエンティティを作る

クラスParserEntity:

import javax.persistence.*; 

@Entity 
@Table(name = "parser", schema = "newsmonitoringdb") 
public class ParserEntity { 
    public ParserEntity() { 
    } 

    public ParserEntity(String name, SourceTypesEntity type) { 
     this.name = name; 
     this.type = type; 
    } 

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

    @ManyToOne(optional = false) 
    @JoinColumn(name="type",referencedColumnName="id") 
    private SourceTypesEntity type; 

    ...//getters, setters and other fields are here 
    } 
} 

クラスParserTypesEntity:

import javax.persistence.*; 
import java.util.Collection; 
import java.util.List; 

/** 
* Created by User on 17.08.2016. 
*/ 
@Entity 
@Table(name = "source_types", schema = "newsmonitoringdb") 
public class ParserTypesEntity { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    @Basic 
    @Column(name = "name") 
    private String name; 

    @OneToMany(mappedBy="type", fetch=FetchType.EAGER, targetEntity = ParserEntity.class) 
    private Collection<ParserEntity> siteParser; 

    ...//getters and setters are here 
    } 
} 

彼らはフィールドによって関係を持っており、すべてがOKと思われます。 しかし、ParserEntityクラスではなく、ParserEntityクラスの名前のみを別のコレクションフィールドに保存するように、ParserTypeEntityクラスが必要です。

ParserEntityオブジェクトで行われたのと同じように、DBから型を取り出すときに自動的に塗りつぶしたいと思います。

これを行う方法はありますか、または単方向の関係を変更して、すべての型を取得してから、各型の名前をIDで取得する必要がありますか?

+0

(すべてのJPAドキュメントのように)モデルの保存内容です。コレクションの文字列を持つようにモデルを修正し、それを設定します。 –

+0

"mappedBy"と "targerEntity"パラメータなしでOneToManyフィールドを作成しようとしました。私はコレクションの文字列パラメータを保存するコレクションを作ったが、コンパイラはOneToMany属性の値の型は "String"であってはならないと伝える – Andrey

+0

明らかに '@ OneToMany'は関係のために使われるべきではない。 '@ ElementCollection'を必要とするStringのCollectionを保存したいと思っています!これらの概念を説明するJPAチュートリアルを読むことをお勧めします –

答えて

0

フィールドごとに関連性があり、すべてが正常であるようです。しかし、 は、ParserEntityリストの代わりに別のCollectionフィールドにParserEntity クラスの名前だけを保存するParserTypeEntityクラスのようです。

DBから 型を取得するときに、自動的にParserEntityオブジェクトで行われるのと同じ方法でそれらを自動的に埋めたいと思います。

私はあなたがコレクションとの関係のためにコンバータを使用できるとは思わない。
さらに、コードをあまり自然でなく読みにくくする可能性があるので、できる限り、私は使用しません。列挙型の場合、有用で全体的な化粧品ですが、エンティティコレクションの場合、エンティティ間のORM関係が解除されるため、ハックのように見えます。

JPA/EntityManagerを使用している場合、回避策を提案できます。エンティティのライフサイクルイベントを使用します。それ以外の場合は、Hibernate/SessionFactoryを使用する場合は、Hibernateのリスナーを見てください。それは同じ原理です。

実際のマッピングを維持し、ParserTypesEntityがロードされたときに自動的に入力される予定のデータが一時的なリストに追加されます。

したがって、ParserTypesEntityでは、エンティティがロードされたときに処理を行うフックメソッドを追加できます。この方法では、parserEntityコレクションの名前を収集し、transient List<String>に追加することができます。

public class ParserTypesEntity { 
... 
    @Transient 
    private List<String> parserTypeNames; 

    @PostLoad 
    public void postLoad() { 
    parserTypeNames = new ArrayList<>(); 
    for (ParserEntity parserEntity : siteParser){ 
     parserTypeNames.add(parserEntity.getName()); 
    } 
    ... 
} 
+0

私はJPA/EntityManagerを使用していますが、あなたのソリューションは面白そうですが、DBからすべてのparserEntitiesをダウンロードする必要があります。 EAGERではなくLAZYタイプ)。この時点では、アプリケーションはDB内のすべてのエンティティの名前だけを必要とするため、このようなことを要求します。 dbから完全に取り除かれたオブジェクトが必要になりますが、90%の使用率ですべてのオブジェクトを処理する必要はありません。 – Andrey

関連する問題