Java 如何避免在连接JPA中的两列时出现额外的表?
我有两个A类和B类,分别为: 这是A班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类{
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每次都创建额外的表。