0

「親」という名前のテーブルを持つデータベースにアクセスする Web アプリケーションがあります。この親には、さらに多くの子の親になることもできる子があります。

public class Thing extends Entity{

  @OneToMany(cascade = {CascadeType.ALL})
  @JoinColumn(name = "parent_id")
  private List<Thing> children = new ArrayList<Thing>();

  @Column
  private String property;

  public String getProperty() { return property; }
  public void setProperty(String property) { this.property = property; }

エンティティは PK プロパティを持っています:

@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;

ここで、HQL クエリから Thing の parent_id プロパティにアクセスしたいと考えています。私がそうするなら:

[Another class]
Query queryParents = getEntityManager().createQuery("from Thing t where t.parent_id is null");

プロパティが存在しないというエラーが表示されます。さて、Thing クラスに以下を追加します。

@Column
private Long parent_id;
public Long getParent_id() { return parent_id; }
public void setParent_id(Long parent_id) { this.parent_id = parent_id; }

それは機能しているようですが、同じエンティティを参照していないため、正しくないと思います...実際、モノのオブジェクトを更新しようとすると、「org.hibernate.StaleObjectStateException: 行が更新されました。または別のトランザクションによって削除されました (または未保存値のマッピングが正しくありませんでした): ...".

では、クラス Thing 自体がプロパティを取得していない場合、エンティティ "Thing" [データベースにはオブジェクト Thing の列 'parent_id' があります] の parent_id プロパティを返す正しい方法は何ですか? 私はこれらすべての初心者です...データベースには、すべてのモノのparent_idフィールドがあり、ルートの親の場合はnullであり、他のすべての親のIDが含まれています。

前もって感謝します。

4

1 に答える 1

1

関連付けを双方向にします。

@OneToMany(mappedBy = "parent")
private List<Thing> children;

@ManyToOne
@JoinColumn(name = "parent_id")
private Thing parent;

そして、クエリは単純になります

select t from Thing t where t.parent is null

親 ID を返すと、次のようになります。

Long parentId = thing.getParent() == null ? null : thing.getParent().getId();

双方向の関連付けについて詳しくは、Hibernate のドキュメントを参照してください。

于 2012-08-07T12:09:19.400 に答える