Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
如何在JavaSpring中从Hibernate中检索数据_Java_Hibernate_Spring Mvc_Bidirectional_Hibernate Onetomany - Fatal编程技术网

如何在JavaSpring中从Hibernate中检索数据

如何在JavaSpring中从Hibernate中检索数据,java,hibernate,spring-mvc,bidirectional,hibernate-onetomany,Java,Hibernate,Spring Mvc,Bidirectional,Hibernate Onetomany,这个问题听起来很简单,但我真的找不到任何有用的东西 我的问题是如何使用双向多通关联的条件(或其他东西)获取DB条目 假设我们有两个班 @Entity @Table(name="tCategory") public class Category { @Id @Column(table="tCategory") @GeneratedValue(strategy = GenerationType.AUTO) private int category_id;

这个问题听起来很简单,但我真的找不到任何有用的东西

我的问题是如何使用双向多通关联的条件(或其他东西)获取DB条目

假设我们有两个班

@Entity
@Table(name="tCategory")
public class Category {

    @Id
    @Column(table="tCategory")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int category_id;

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="category")
    private Set<SubCategory> subcategory;

    ..............
    public Set<SubCategory> getSubcategory() {
        return subcategory;
    }
    public void setSubcategory(Set<SubCategory> subcategory) {
        this.subcategory = subcategory;
    }

    public int getCategory_id() {
        return category_id;
    }
    public void setCategory_id(int category_id) {
        this.category_id = category_id;
    }
    ..............
    @Override
    public String toString() {
        return "Category [category_id=" + category_id + ", subcategory=" + subcategory + "]";
    }
}


@Entity
@Table(name="tSubCategory")
public class SubCategory {

    @Id
    @Column(table="tSubCategory")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int subcategory_id;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name="category_id")
    private Category category;

    public Category getCategory() {
        return category;
    }

    ........

    public void setCategory(Category category) {
        this.category = category;
    }

    public int getSubcategory_id() {
        return subcategory_id;
    }
    public void setSubcategory_id(int subcategory_id) {
        this.subcategory_id = subcategory_id;
    }

    ........
    @Override
    public String toString() {
        return "Category [category_id=" + category_id + ", subcategory=" + subcategory + "]";
    }
}
我确信我们正在检索category列值,并查看hibernate正在记录的查询

有什么想法吗

我在这里添加了一些信息,因为我认为我们从DB获得的信息是正确的,但是延迟加载有问题

我以这种方式更改了getSubCategoriesById:

    @Override
        public List<SubCategory> getSubCategoriesById(int category_id) {
            Session session = this.sessionFactory.openSession();
            Transaction tx = session.beginTransaction();

            Criterion cr = Restrictions.eq("category.category_id",category_id);
            List<SubCategory> subcategories = session.createCriteria(SubCategory.class).add(cr).list();
            tx.commit();
            session.close();

            return subcategories;
        }

and I am tried to log the results on controller.

@RequestMapping(value="/loadSubCategories", produces = "application/json")
    public @ResponseBody List<SubCategory> loadSubCategories(@RequestParam int id) {
        System.out.println("->apo get" + id);

        List<SubCategory> subcategories = hierarchyDAO.getSubCategoriesById(id);
        System.out.println("size: " + subcategories.size());

        int i = 0;
        while (i < subcategories.size()) {
            System.out.println("category name " + subcategories.get(i).getCategory().getName());
            System.out.println("subcategory name " + subcategories.get(i).getName());
            System.out.println("subcategory details " + subcategories.get(i).getDetails());
            i++;
        }

        return subcategories;
    }
例外文件:

public class HierarchyDAOImpl implements HierarchyDAO {

private SessionFactory sessionFactory;

public HierarchyDAOImpl(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

@Override
public List<Category> getAllCategories() {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    List<Category> categories;
    categories = session.createCriteria(Category.class).list();
    tx.commit();
    session.close();
    return categories;
}

@Override
public List<SubCategory> getAllSubCategories() {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    List<SubCategory> subcategories;
    subcategories = session.createCriteria(SubCategory.class).list();
    tx.commit();
    session.close();
    return subcategories;
}

@Override
public Category getCategory(int id) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    Category category = (Category) session.get(Category.class, id);
    tx.commit();
    session.close();
    return category;
}

@Override
public SubCategory getSubCategory(int id) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    SubCategory subcategory = (SubCategory) session.get(SubCategory.class, id);
    tx.commit();
    session.close();
    return subcategory;
}

@Override
public int createCategory(Category category) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.saveOrUpdate(category);
    tx.commit();
    session.close();
    return category.getCategory_id();
}

@Override
public int createSubCategory(SubCategory subcategory) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.saveOrUpdate(subcategory);
    tx.commit();
    session.close();
    return subcategory.getSubcategory_id();
}

@Override
public int deleteCategory(Category category) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.delete(category);
    tx.commit();
    session.close();
    return 1;
}

@Override
public int deleteSubCategory(SubCategory subcategory) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    session.delete(subcategory);
    tx.commit();
    session.close();
    return 1;
}

@Override
public List<SubCategory> getSubCategoriesById(int category_id) {
    Session session = this.sessionFactory.openSession();
    Transaction tx = session.beginTransaction();


    Query query = session.createQuery("from tCategory c inner join fetch c.subcategory where c.category_id = :id");

    List<SubCategory> subcategories = query.setParameter("id", category_id).list();
    tx.commit();
    session.close();

    return subcategories;
}
@表(name=“tCategory”) 公共类类别{

@Id
@Column(table="tCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int category_id;
@Column(table="tCategory")
private String name;
@Column(table="tCategory")
private int sort;
@Column(table="tCategory")
private String color;
@Column(table="tCategory")
private int icon_id;
@Column(table="tCategory")
private String details;
@OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="category")
private List<SubCategory> subcategory;

public int getCategory_id() {
    return category_id;
}
public void setCategory_id(int category_id) {
    this.category_id = category_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}

public List<SubCategory> getSubcategory() {
    return subcategory;
}
public void setSubcategory(List<SubCategory> subcategory) {
    this.subcategory = subcategory;
}
@Override
public String toString() {
    return "Category [category_id=" + category_id + ", name=" + name + ", sort=" + sort + ", color=" + color
            + ", icon_id=" + icon_id + ", details=" + details + ", subcategory=" + subcategory + "]";
}
@Id
@Column(table="tSubCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int subcategory_id;
@Column(table="tSubCategory")
private String name;
@Column(table="tSubCategory")
private int sort;
@Column(table="tSubCategory")
private String color;
@Column(table="tSubCategory")
private int icon_id;
@Column(table="tSubCategory")
private String details;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="category_id")
private Category category;

public int getSubcategory_id() {
    return subcategory_id;
}
public void setSubcategory_id(int subcategory_id) {
    this.subcategory_id = subcategory_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}
public Category getCategory() {
    return category;
}
public void setCategory(Category category) {
    this.category = category;
}
@Override
public String toString() {
    return "SubCategory [subcategory_id=" + subcategory_id + ", name=" + name + ", sort=" + sort + ", color="
            + color + ", icon_id=" + icon_id + ", details=" + details + ", category=" + category + "]";
}
@表(name=“tSubCategory”) 公共类子类别{

@Id
@Column(table="tCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int category_id;
@Column(table="tCategory")
private String name;
@Column(table="tCategory")
private int sort;
@Column(table="tCategory")
private String color;
@Column(table="tCategory")
private int icon_id;
@Column(table="tCategory")
private String details;
@OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="category")
private List<SubCategory> subcategory;

public int getCategory_id() {
    return category_id;
}
public void setCategory_id(int category_id) {
    this.category_id = category_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}

public List<SubCategory> getSubcategory() {
    return subcategory;
}
public void setSubcategory(List<SubCategory> subcategory) {
    this.subcategory = subcategory;
}
@Override
public String toString() {
    return "Category [category_id=" + category_id + ", name=" + name + ", sort=" + sort + ", color=" + color
            + ", icon_id=" + icon_id + ", details=" + details + ", subcategory=" + subcategory + "]";
}
@Id
@Column(table="tSubCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int subcategory_id;
@Column(table="tSubCategory")
private String name;
@Column(table="tSubCategory")
private int sort;
@Column(table="tSubCategory")
private String color;
@Column(table="tSubCategory")
private int icon_id;
@Column(table="tSubCategory")
private String details;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="category_id")
private Category category;

public int getSubcategory_id() {
    return subcategory_id;
}
public void setSubcategory_id(int subcategory_id) {
    this.subcategory_id = subcategory_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}
public Category getCategory() {
    return category;
}
public void setCategory(Category category) {
    this.category = category;
}
@Override
public String toString() {
    return "SubCategory [subcategory_id=" + subcategory_id + ", name=" + name + ", sort=" + sort + ", color="
            + color + ", icon_id=" + icon_id + ", details=" + details + ", category=" + category + "]";
}

}

您可以使用以下查询,使用Hibernate查询语言轻松执行此操作

Query query = session.createQuery("from Category c inner join fetch c.subCategory where c.category_id := id");

query.setParamter("id", yourId);

这将获取一个类别以及所有关联的子类别

您可以使用Hibernate查询语言使用以下查询轻松执行此操作

Query query = session.createQuery("from Category c inner join fetch c.subCategory where c.category_id := id");

query.setParamter("id", yourId);


这将获取一个类别以及所有关联的子类别

在使用集合之前,您的会话已关闭。
最后{session.close();
我认为这与错误无关,因为我可以从控制器获取子类别值,例如subcategories.get(0).getSubcategory_id();当我尝试从子类别(例如subcategories.get(0).getCategory()访问category对象时出现问题;如果没有,请说明hibernate会话使用的对象的生命周期。一对多和多对一的默认获取类型是惰性的。请尝试定义FetchType.EAGER并重试。在使用集合之前,您的会话已关闭。
最后{session.close();
我认为这与错误无关,因为我可以从控制器获取子类别值,例如子类别。get(0)。getSubcategory_id();我在尝试从子类别访问类别对象时遇到问题,例如子类别。get(0)。getCategory();如果没有,请说明hibernate会话使用的对象的生命周期。一对多和多对一的默认获取类型是惰性的。请尝试定义FetchType.EAGER并尝试。我想知道除了使用HQL之外,是否还有其他方法可以做到这一点。我将尝试您的解决方案,并让您知道。我收到以下错误:org.hibernate.HQL.internal、 ast.QuerySyntaxException:tCategory未映射[从tCategory c内部联接获取c.tSubCategory,其中c.category_id=:id]正如异常所提到的,这是一个语法问题。我认为您没有在查询中键入subcategory属性。它不应该是内部的join fetch c.subcategory而不是c.subcategory。还有其他方法可以做到这一点,例如指定fetch type eager,但随后您就失去了延迟加载的好处。您正在编写。现在我得到了org.hibernate.hql.internal.ast.QuerySyntaxException:tCategory未映射[从tCategory c内部连接获取c.subcategory,其中c.category_id=:id]我想知道除了使用HQL,是否还有其他方法可以做到这一点。我将尝试您的解决方案,并让您知道。我收到了以下错误:org.hibernate.HQL.internal.ast.QuerySyntaxException:tCategory未映射[从tCategory c内部连接获取c.tSubCategory,其中c.category_id=:id]正如异常所提到的,这是一个语法问题。我认为您没有在查询中键入subcategory属性。它不应该是内部的join fetch c.subcategory而不是c.subcategory。还有其他方法可以做到这一点,例如指定fetch type eager,但随后您就失去了延迟加载的好处。您正在编写。现在我得到了org.hibernate.hql.internal.ast.QuerySyntaxException:tCategory未映射[从tCategory c内部连接获取c.subcategory,其中c.category_id=:id]
@Id
@Column(table="tCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int category_id;
@Column(table="tCategory")
private String name;
@Column(table="tCategory")
private int sort;
@Column(table="tCategory")
private String color;
@Column(table="tCategory")
private int icon_id;
@Column(table="tCategory")
private String details;
@OneToMany(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy="category")
private List<SubCategory> subcategory;

public int getCategory_id() {
    return category_id;
}
public void setCategory_id(int category_id) {
    this.category_id = category_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}

public List<SubCategory> getSubcategory() {
    return subcategory;
}
public void setSubcategory(List<SubCategory> subcategory) {
    this.subcategory = subcategory;
}
@Override
public String toString() {
    return "Category [category_id=" + category_id + ", name=" + name + ", sort=" + sort + ", color=" + color
            + ", icon_id=" + icon_id + ", details=" + details + ", subcategory=" + subcategory + "]";
}
@Entity
@Id
@Column(table="tSubCategory")
@GeneratedValue(strategy = GenerationType.AUTO)
private int subcategory_id;
@Column(table="tSubCategory")
private String name;
@Column(table="tSubCategory")
private int sort;
@Column(table="tSubCategory")
private String color;
@Column(table="tSubCategory")
private int icon_id;
@Column(table="tSubCategory")
private String details;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name="category_id")
private Category category;

public int getSubcategory_id() {
    return subcategory_id;
}
public void setSubcategory_id(int subcategory_id) {
    this.subcategory_id = subcategory_id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getSort() {
    return sort;
}
public void setSort(int sort) {
    this.sort = sort;
}
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public int getIcon_id() {
    return icon_id;
}
public void setIcon_id(int icon_id) {
    this.icon_id = icon_id;
}
public String getDetails() {
    return details;
}
public void setDetails(String details) {
    this.details = details;
}
public Category getCategory() {
    return category;
}
public void setCategory(Category category) {
    this.category = category;
}
@Override
public String toString() {
    return "SubCategory [subcategory_id=" + subcategory_id + ", name=" + name + ", sort=" + sort + ", color="
            + color + ", icon_id=" + icon_id + ", details=" + details + ", category=" + category + "]";
}
Query query = session.createQuery("from Category c inner join fetch c.subCategory where c.category_id := id");

query.setParamter("id", yourId);