0

自分自身に関連付けられているクラスで問題が発生しています。オブジェクトそれはこれです:

Category.java

package com.borjabares.pan_ssh.model.category;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

import com.borjabares.pan_ssh.util.Trimmer;

@Entity
public class Category {
private long categoryId;
private String name;
private Category parent;

public Category() {
}

public Category(String name, Category parent) {
    this.name = name;
    this.parent = parent;
}

@SequenceGenerator(name = "CategoryIdGenerator", sequenceName = "CategorySeq")
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "CategoryIdGenerator")
public long getCategoryId() {
    return categoryId;
}

public void setCategoryId(long categoryId) {
    this.categoryId = categoryId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = Trimmer.trim(name);
}

@ManyToOne(optional=false, fetch=FetchType.EAGER) 
@JoinColumn(name="categoryId", insertable=false, updatable=false, nullable = true)
public Category getParent() {
    return parent;
}

public void setParent(Category parent) {
    this.parent = parent;
}

@Override
public String toString() {
    return "Category [\ncategoryId=" + categoryId + ", \nname=" + name
            + ", \nparent=" + parent + "]";
}
}

アソシエーションは1レベルだけ深いです。挿入、およびその他のクエリが機能しています。しかし、親カテゴリのみまたは非親カテゴリを選択しようとすると、Hibernateは親カテゴリまたはテーブルのすべての結果に対して0の結果しか返しません。

現在のクエリはこのようなものですが、結合を使用する他の多くのクエリはnullであり、他のメソッドは常に同じ結果を取得します。

@SuppressWarnings("unchecked")
public List<Category> listParentCategories() {
    return getSession().createQuery(
            "SELECT c FROM Category c WHERE c.parent is null ORDER BY c.name")
            .list();
}

ありがとう、そして私がこれを書いたかもしれない間違いをお詫びします。

編集:

挿入は正常に機能します。jUnitにすべてのカテゴリをリストして印刷すると、次のようになります。

Category [
categoryId=416, 
name=Deportes, 
parent=null], 
Category [
categoryId=417, 
name=Formula 1, 
parent=Category [
categoryId=416, 
name=Deportes, 
parent=null]], 
Category [
categoryId=418, 
name=F?tbol, 
parent=Category [
categoryId=416, 
name=Deportes, 
parent=null]]

挿入のほかに、カテゴリは親または子のみであり、カテゴリは彼自身の父親になることはできないことを制御しています。

4

1 に答える 1

0

同じ列(categoryId)を使用して、カテゴリを一意に識別し、親カテゴリを参照しています。すべてのカテゴリが明らかに親として存在するため、これはおそらく機能しません。親カテゴリIDを保持するために別の列が必要です。

@Id
@SequenceGenerator(name = "CategoryIdGenerator", sequenceName = "CategorySeq")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "CategoryIdGenerator")
@Column(name = "categoryId") // not necessary, but makes things clearer
public long getCategoryId() {
    return categoryId;
}

// optional must be true: some categories don't have a parent
@ManyToOne(optional = true, fetch = FetchType.EAGER) 
// insertable at least must be true if you want to create categories with a parent
@JoinColumn(name = "parentCategoryId", nullable = true)
public Category getParent() {
    return parent;
}
于 2012-08-10T20:09:37.777 に答える