2017-06-20 5 views
0

私は比較的新しいHibernateです。Hibernate JPA:親オブジェクトがフェッチされたときに子オブジェクトをフェッチする方法。ただし、親オブジェクトのみを保持します

質問親オブジェクトをフェッチしたときに、子オブジェクトと親オブジェクトの両方をフェッチする方法です。ただし、持続時間中は、子オブジェクトのみを保持します。

By by、外部キーはNOTデータベースレベルで関連付けられています。

------------------- 
ParentObject.java 
------------------- 

private Integer internalId; 
private Set<ChildObject> childObjects = new HashSet<>(0); 
private Integer userId; 

//associated Setters as well. 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "InternalId", unique = true, nullable = false) 
public Integer getInternalId() { 
    return this.internalId; 
} 

@OneToMany(fetch = FetchType.EAGER, mappedBy = "parentObject") 
public Set<ChildObject> getChildObjects() { 
    return childObjects; 
} 


------------------- 
ChildObject.java 
------------------- 

private Integer internalRecordId; 
private Integer userId; 
private ParentObject parentObject; 

// associated setters and remaining getters. 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "userId", nullable = true) 
public ParentObject getParentObject() { 
    return parentObject; 
} 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "InternalId", unique = true, nullable = false) 
public Integer getInternalId() { 
    return this.internalId; 
} 

コード

Scenario1: 
    Criteria criteria = getCriteria(ParentObject.java); 
    criteria.add(Restrictions.eq("internalId", 123); 
    Collection result = new LinkedHashSet(criteria.list()); 
    List<ParentObject> resultSet = new ArrayList<>(result); 

    for(ParentObject parentObj : resultSet) { 

    parentObj.getChildObjects() --> Getting all associated Child Objects. 
    } 

以下で細かい動作のみ子オブジェクトを永続化しようとする場合は、失敗します。

ChildObject childObj = new ChildObject(); 
    childObj.setUserId(123456); 
    getSession().save(childObj); 

業務フローは、親オブジェクトと空parentObject行を必要としないかもしれないので、私は、しかし、それは参照として親オブジェクトを必要としていることを理解し、この問題を解決できる方法をDBに持続してはいけませんか?

答えて

0

双方向oneToMany関係では、「多くの」側が関係の所有者と呼ばれていますあなたの場合ChildObjectエンティティリレーションシップのオーナーはデータベース内のFKの管理を担当します。あなたが何らかの理由でparentへの参照を持っていない場合は、少なくともそのIdが必要です。それをロードして、あなたの子インスタンスに設定することができます。これはREST APIの一般的なシナリオです。たとえば、特定の親の新しい子アイテムを作成するためのエンドポイントリソースがあるとします。そのためには、おそらくPOST http://server/restapi/parent/12/childrenのような処理を行います - 新しい子をid 12の親に挿入します。javaでは、 、あなたは最初にidで親を取り出してから単純化しますそれを子供に設定してください。このようにして、ORMはdb内の関係を正しく表現します。
N + 1の問題を避けるために、parent.getChildobjectsのフェッチタイプをLazyに変更し、検索メソッドをリファクタリングして、現在のimplとしてNの代わりに単一のクエリで子オブジェクトを明示的にフェッチする必要があります。
ハッピーハッキング

+0

アドバイスありがとうございます! –

+0

@SrinivasLakshman助けがあれば、その答えにAcceptedとマークしてください。 – yntelectual

関連する問題