2017-05-26 8 views
1

私はxjcを使ってディレクトリを表すモデルクラスを作成しました。 jax-bとjpaで使用するために注釈が付けられています。そのモデルディレクトリので、ディレクトリは、クラスのプロパティの1ので、文書(ファイル)や他のディレクトリの両方を含めることができます:あなたは、私はどちらかのインスタンスできるオブジェクトのリストを持っていることがわかりますJPAを使用してオブジェクトの型を表にマップできますか?

@XmlElements({ 
    @XmlElement(name = "dir", type = Dir.class), 
    @XmlElement(name = "document", type = Document.class) 
}) 
protected List<Object> dirOrDocument = new ArrayList<>(); 

DirまたはDocumentクラス。これは、jax-bを使用してXMLにマーシャリングするのに最適ですが、JPAを使用してこれをデータベースに保持したい場合、Objectがinstanceof DirであるかどうかをJPAに伝え、Dirテーブルに書き込みます。オブジェクトがドキュメントのインスタンスである場合、ドキュメントテーブルに書き込みますか?

JPA AttributeConverterを使用してみましたが、あるタイプから別のタイプに変換するように見えるので有望ですが、複数のタイプに変換する必要があります。

おそらく、JAXBとJPAの両方で使用できるモデルを表現する別の方法がありますか?

JAXBとJPAの両方の実装にeclipselinkを使用しています。

答えて

1

のいずれかは、二つの別個のアソシエーション(subDirectories、及びdocuments)を作る、または共通のフィールド(nameparentDirectory、等)、及び2つのサブクラスDirectoryDocumentを含む抽象エンティティ(例えばFile)を作成します。継承をマッピングするさまざまな方法を理解するために、継承に関するHibernateのマニュアルの章を読んでください。

+0

私があなたが言及した継承メソッドを試すかもしれないと思います。それはjpaとうまくフィットする自然な解決策のようです。 – cditcher

1

更新:JB Nizetが提案した継承を使用してこの問題を解決できました。私は、次のような抽象エンティティクラスを作成しました:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@XmlTransient 
public abstract class CNode { 

@Id 
@GeneratedValue 
@Column(name = "nodeId") 
@XmlTransient 
protected int nodeId; 

// getters and setters 
} 

とするために、リストを変換:私はその後、私のDir.classとDocument.classは私CNode.classを延長作っ

@XmlElements({ 
    @XmlElement(name = "dir", type = Dir.class), 
    @XmlElement(name = "document", type = Document.class) 
}) 
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch=FetchType.LAZY, orphanRemoval=true) 
protected List<CNode> dirOrDocument = new ArrayList<>(); 

。今はすべてjaxbとjpaを使って動作します。

関連する問題