Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Database 休眠条件一对多关系_Database_Hibernate_Database Design - Fatal编程技术网

Database 休眠条件一对多关系

Database 休眠条件一对多关系,database,hibernate,database-design,Database,Hibernate,Database Design,我有两个实体:经销商和制造商。经销商有多个品牌。我能够将记录作为这两个实体之间的一对多关系插入 但是,我无法根据经销商ID检索记录。我尝试了许多不同的方法,但它仍然抛出此异常:未找到属性make(它是表):类名(全名) 如果有人能给我一些提示,我将不胜感激 经销商: import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persi

我有两个实体:
经销商
制造商
。经销商有多个品牌。我能够将记录作为这两个实体之间的一对多关系插入

但是,我无法根据经销商ID检索记录。我尝试了许多不同的方法,但它仍然抛出此异常:
未找到属性make(它是表):类名(全名)

如果有人能给我一些提示,我将不胜感激

经销商:

 import java.util.HashSet;
    import java.util.Set;    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.OneToMany;
    import javax.persistence.JoinTable;
    import javax.persistence.CascadeType;
    import javax.persistence.JoinColumn;
    @Entity
    @Table(name = "dealer")
    public class Dealer implements java.io.Serializable{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        public Dealer(){

        }
        public Dealer(String DealerName,String dealerPhno,Set makes){
            this.dealerName=DealerName;
            this.dealerphno=dealerPhno;
            this.dealerMakes=makes;

        }
        public void setDealerMakes(Set<Make> dealerMakes) {
            this.dealerMakes = dealerMakes;
        }
        @Id
        @GeneratedValue
        @Column(name = "dealer_id")
        private long dealerId;
        public long getDealerId() {
            return dealerId;
        }
        public void setDealerId(long dealerId) {
            this.dealerId = dealerId;
        }
        public String getDealerName() {
            return dealerName;
        }
        public void setDealerName(String dealerName) {
            this.dealerName = dealerName;
        }
        public String getDealerphno() {
            return dealerphno;
        }
        public void setDealerphno(String dealerphno) {
            this.dealerphno = dealerphno;
        }
        @Column(name = "dealer_name" ,unique=true, nullable = false, length=20)
        private String dealerName;
        @Column(name = "dealer_phno" , nullable = false, length=20)
        private String dealerphno;
        @OneToMany(cascade = CascadeType.ALL)
        //@OneToMany(fetch=FetchType.EAGER)
        @JoinColumn(name="dealer_id", nullable=false)
        //@JoinTable(name = "dealer_make", joinColumns = { @JoinColumn(name = "dealer_id") }, inverseJoinColumns = { @JoinColumn(name = "make_id") })
        private Set<Make> dealerMakes = new HashSet<Make>(0);

        public Set<Make> getDealerMakes() {
            return dealerMakes;
        }

    }
我尝试的查询:

 Criteria dealer=sessionFactory.getCurrentSession().createCriteria(Dealer.class);
 Criteria make=dealer.createCriteria(make);
 make.add(Restrictions.gt("dealerId",new Long(dealerId)));
 List<Dealer> results=dealer.list(); //throwing exception
Criteria dealer=sessionFactory.getCurrentSession().createCriteria(dealer.class);
标准品牌=经销商。创建标准(品牌);
make.add(Restrictions.gt(“dealerId”),new Long(dealerId));
列表结果=经销商。列表()//抛出异常
我期待的输出:

 Criteria dealer=sessionFactory.getCurrentSession().createCriteria(Dealer.class);
 Criteria make=dealer.createCriteria(make);
 make.add(Restrictions.gt("dealerId",new Long(dealerId)));
 List<Dealer> results=dealer.list(); //throwing exception
经销商Id经销商名称电话号码

1清真寺074563485

Make有以下记录:

make\u id makename makeprice经销商\u id

1辆福特3000美元1辆

2现代2000美元1

我想要经销商详细信息和make details之类的结果。

public List finddelers(){
    public List<Dealer> findDealers() {
    Criteria dealer=sessionFactory.getCurrentSession().createCriteria(Dealer.class);
    Criteria make=dealer.createCriteria(make);
    make.setFetchMode("dealer", FetchMode.JOIN);
    make.add(Restrictions.gt("dealerId",new Long(dealerId)));
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // depends on wat u want
    return criteria.list();
    }
Criteria dealer=sessionFactory.getCurrentSession().createCriteria(dealer.class); 标准品牌=经销商。创建标准(品牌); make.setFetchMode(“经销商”,FetchMode.JOIN); make.add(Restrictions.gt(“dealerId”),new Long(dealerId)); criteria.setResultTransformer(criteria.DISTINCT_ROOT_ENTITY);//取决于您想要什么 返回条件。list(); }

试着像这样返回,希望它能工作,如果还有更多,请告诉我。因此,您希望向经销商加载他们的品牌,并且您只希望经销商的ID大于给定的ID

首先,你可以直接加载经销商。当您调用
getDealerMakes()
时,Hibernate将自动加载他们的品牌列表:

Criteria c=session.createCriteria(Dealer.class);
c、 添加(Restrictions.gt(“dealerId”,dealerId));//假设delerId=6
列出经销商=c.List();//执行SQL查询,从经销商d中选择d*,其中d.dealer\u id>6
用于(经销商:经销商){
设置make=dealer.getDealerMakes()//执行SQL查询,从make m中选择m。*,其中m.dealer\u id=
}
这有执行N+1查询的缺点

因此,如果要在单个查询中加载经销商及其品牌,则需要设置获取模式,以便加载品牌。请注意,由于联接使用您在Dealer和Make之间定义的关联,因此无需告诉Hibernate Dealer表的ID必须等于Make表的Dealer_ID:Hibernate已经知道这一点,这要感谢您在关联上添加的JoinColumn注释。因此,查询如下:

Criteria c = session.createCriteria(Dealer.class);
c.add(Restrictions.gt("dealerId", dealerId));

// this tells Hibernate that the makes must be fetched from the database
// you must use the name of the annotated field in the Java class: dealerMakes
c.setFetchMode("dealerMakes", FetchMode.JOIN);

// Hibernate will return instances of Dealer, but it will return the same instance several times
// once per make the dealer has. To avoid this, you must use a distinct root entity transformer
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Delaer> dealers = c.list(); // executes the SQL query:
// select d.*, m.* from dealer d left join make m on d.dealer_id = m.dealer_id where d.dealer_id > 6
for (Dealer dealer : dealers) {
    Set<Make> make = dealer.getDealerMakes() // no SQL query. The makes are already loaded
}
Criteria c=session.createCriteria(Dealer.class);
c、 添加(Restrictions.gt(“dealerId”,dealerId));
//这告诉Hibernate必须从数据库中获取make
//必须使用Java类中带注释字段的名称:dealerMakes
c、 setFetchMode(“dealerMakes”,FetchMode.JOIN);
//Hibernate将返回Dealer的实例,但它将多次返回相同的实例
//经销商每生产一次。要避免这种情况,必须使用不同的根实体转换器
criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u实体);
列出经销商=c.List();//执行SQL查询:
//从经销商d左侧选择d.*,m.*并在d上连接make m。经销商id=m.经销商id,其中d.经销商id>6
用于(经销商:经销商){
设置make=dealer.getDealerMakes()//无SQL查询。make已加载
}

这就成功了

向我们显示您的实体和您尝试的查询。@JB Nizet:我添加了我的实体和查询。请看一看。您希望此查询做什么?它应该返回什么?@JB Nizet:我编辑了我的查询,请看一看:谢谢,在你代码的第三行中,make应该在引号内,对吗?我不太确定这是否真的有效。假设Make有一个注释为EAGER的manytone关联(比如City)。生成的查询看起来仍然相同,但只要调用getDealerMakes(),就会有DB访问权来获取城市。对吗?至少我认为这就是我现在所经历的。有解决办法吗?没有解决办法。无论你做什么,标记为“渴望”的关联总是被热切地加载。如果你不想每次都迫不及待地加载它,你必须让它延迟加载。你误解了这个问题。城市应该自动获取,但它们不是。我发现我遇到了这个错误:@JBNizet如果我们想查询经销商品牌和匹配的品牌名称,我们会怎么做?我们加载相关的经销商???再看看这个问题。谢谢
Criteria c = session.createCriteria(Dealer.class);
c.add(Restrictions.gt("dealerId", dealerId));

// this tells Hibernate that the makes must be fetched from the database
// you must use the name of the annotated field in the Java class: dealerMakes
c.setFetchMode("dealerMakes", FetchMode.JOIN);

// Hibernate will return instances of Dealer, but it will return the same instance several times
// once per make the dealer has. To avoid this, you must use a distinct root entity transformer
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Delaer> dealers = c.list(); // executes the SQL query:
// select d.*, m.* from dealer d left join make m on d.dealer_id = m.dealer_id where d.dealer_id > 6
for (Dealer dealer : dealers) {
    Set<Make> make = dealer.getDealerMakes() // no SQL query. The makes are already loaded
}
criteria.setFetchMode("dealerMakes", FetchMode.JOIN);
criteria.createCriteria("dealerMakes");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);