Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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 如何避免在连接JPA中的两列时出现额外的表?_Java_Mysql_Hibernate_Hibernate Mapping_Hibernate Criteria - Fatal编程技术网

Java 如何避免在连接JPA中的两列时出现额外的表?

Java 如何避免在连接JPA中的两列时出现额外的表?,java,mysql,hibernate,hibernate-mapping,hibernate-criteria,Java,Mysql,Hibernate,Hibernate Mapping,Hibernate Criteria,我有两个A类和B类,分别为: 这是A班 class A{ private int id; private String name ; private String emailId; @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="aList") List<B> bList; // getter and setters } A类{

我有两个A类和B类,分别为:

这是A班

class A{
  private int id;
  private String name ;
  private String emailId;
  
  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="aList")
  List<B> bList;
 
  // getter and setters 
}
A类{
私有int-id;
私有字符串名称;
私有字符串emailId;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY,mappedBy=“aList”)
列表列表;
//二传手
}
这是B班

class B{
  private int id;
  private int AId ;
  private String location;
  
  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  List<A> aList;
 
  // getter and setters 
}
B类{
私有int-id;
私人国际援助;
私有字符串位置;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
清单主义者;
//二传手
}
这是Dao类方法,我试图用它来获取连接的数据

public List<A> getA() {
        Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
        CriteriaBuilder builder = session.getCriteriaBuilder();
        CriteriaQuery<A> criteria = builder.createQuery(A.class);
        Root<A> root = criteria.from(A.class);
        Join<A, B> joinList = root.join("bList", JoinType.LEFT);
        try{
            Predicate filters = builder.and(builder.equal(joinList.get("AId"),root.get("id")),
                    builder.equal(root.get("name"), "xxx"));
            
            criteria.where(filters);
            List<A> aList = (List<A>)session.createQuery(criteria).getResultList();
            return aList;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
公共列表getA(){
Session Session=entityManagerFactory.unwrap(SessionFactory.class).openSession();
CriteriaBuilder=session.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(A.class);
根=标准。从(A.class);
Join-joinList=root.Join(“bList”,JoinType.LEFT);
试一试{
谓词过滤器=builder.and(builder.equal(joinList.get(“AId”)、root.get(“id”),
builder.equal(root.get(“name”),“xxx”);
标准。其中(过滤器);
List aList=(List)session.createQuery(criteria.getResultList();
回归主义者;
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
但每次它创建另一个表时,我不希望创建额外的表,而是希望像在mysql中一样应用join,即不创建任何额外的表。如何做到这一点


如果我理解正确,谢谢你<代码>联接运算符未自行创建新表。而是你描述你的实体的方式。您使用了创建另一个表的
Many-to-Many
关系。这个表需要满足3个数据库的标准形式

解决方案

  • 接受另一个表的存在,直到您希望保持数据库的一致性并防止数据泄漏
  • 重新定义实体,使其具有
    多对一
    一对多
    关系

  • 您认为额外的表是在哪里创建的?您是否检查了执行的sql?你能展示一下你在mysql中的表现吗?在manytomay关系中,对于我正在应用的每个连接(ManyToMany或OneToMany),必须有额外的连接表,hibernate每次都创建额外的表。