Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有自反联想的HQL不';行不通_Java_Spring_Hibernate_Junit - Fatal编程技术网

Java 具有自反联想的HQL不';行不通

Java 具有自反联想的HQL不';行不通,java,spring,hibernate,junit,Java,Spring,Hibernate,Junit,我遇到了一个与自身相关的类的问题。对象是这样的: 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

我遇到了一个与自身相关的类的问题。对象是这样的:

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 + "]";
}
}
这种联系只有一个层次。插入,其他查询正在运行。但是,当我尝试仅选择父类别或非父类别时,Hibernate仅为父类别或表的所有结果返回0个结果

现在的查询是这样的,但是我有很多其他的带有连接的查询是空的,其他方法总是得到相同的结果

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

此外,在插入中,我控制类别只能是父类别或子类别,而类别不能是其自己的父类别。

您使用同一列(
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;
}

是,可选项必须为true(该死的复制粘贴)。但是,如果我删除insertable和updateable等于true,我就会在实体com.borjabares.pan_ssh.model.category.category列的映射中使用jUnit:org.hibernate.MappingException:Repeated列运行测试时出现此错误:categoryId(应该使用insert=“false”update=“false”映射)是的,这是主要问题,我在回答中指出:您使用ID列引用父类别,这显然是错误的。您必须使用另一个列名:
@JoinColumn(name=**“parentCategoryId”**,nullable=true)
哦,好吧,我搞错了,就是这样。非常感谢你!!我很困惑,因为插入工作正常,所以我错误地认为这与查询有关。
@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;
}