2

JPA(またはHibernate)で複数のレベルを維持することは可能ですか?各リソースが別のリソースの「子」になることができるテーブル「リソース」があります。これは、複数のレベルで発生する可能性があります。関係を含めるために結合テーブルを使用しています。

私が達成したいのはこれです。

resource                                        resource_relations
========                                        ==================
resource_type | resource_name                   parent   | child
------------------------------                  --------------------
type1         | P                               P        | C
type2         | C                               C        | G  
type3         | G

私の永続エンティティは次のようになります。

リソース

private String name;
private ResourceType resourceType;

public Resource(resourceType, name){ ... }   

@OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST)
private Set<ResourceRelation> components = new HashSet<ResourceRelation>();

@OneToMany(mappedBy = "child", cascade = CascadeType.PERSIST)
private Set<ResourceRelation> parents = new HashSet<ResourceRelation>();

public void addComponent(Resource r) { /*add "r" to "components"*/ }

ResourceRelation

@ManyToOne (cascade = CascadeType.PERSIST)
private Resource parent;

@ManyToOne (cascade = CascadeType.PERSIST)
private Resource child;

ここで、次のステートメントを実行します。

parent = new Resource(type1, P);
child = new Resource(type2, C);
grandChild = new Resource(type3, G);
child.addComponent(grandChild);
parent.addComponent(child);
persist(parent);

ただし、PとCのみが永続的になり、Gは永続化されません。どうすればよいですか?

4

1 に答える 1

3

マッピングが間違っているため、リソース間の関係を含むテーブルを明示的に処理しないでください。Hibernateがあなたに代わってそれを行います!ここでは、Resourceクラスのみが必要です。

private String name;
private ResourceType resourceType;

@OneToMany(cascade = CascadeType.PERSIST)
private Set<Resource> components = new HashSet<Resource>();

@OneToMany(cascade = CascadeType.PERSIST)
private Set<Resource> parents = new HashSet<Resource>();
于 2013-02-20T10:12:30.217 に答える