Java 一对多双向映射

Java 一对多双向映射,java,hibernate,one-to-many,Java,Hibernate,One To Many,我正在使用 hibernate-jpa-2.0-api-1.0.1.Final jar hibernate-commons-annotations-4.0.4.Final hibernate-core-4.2.5.Final 我的实体类别公司和分公司: @Entity @Table(name = "company") public class Company { @Id @Column(name = "ID") @GeneratedValu

我正在使用

hibernate-jpa-2.0-api-1.0.1.Final jar

hibernate-commons-annotations-4.0.4.Final

hibernate-core-4.2.5.Final

我的实体类别公司和分公司:

@Entity
@Table(name = "company")
public class Company {
    @Id
    @Column(name = "ID") @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy="company",cascade = CascadeType.ALL)
    @Fetch(FetchMode.SELECT)
    private Set<Branch> branchs;
}

@Entity
@Table(name = "branch")
public class Branch {
    @Id @Column(name = "ID") @GeneratedValue
    private Integer id;

    @LazyCollection(LazyCollectionOption.FALSE)
    @ManyToOne
    @JoinColumn(name = "company_id")
    private Company company;
}
@实体
@表(name=“公司”)
公营公司{
@身份证
@列(name=“ID”)@GeneratedValue
私有整数id;
@OneToMany(mappedBy=“company”,cascade=CascadeType.ALL)
@Fetch(FetchMode.SELECT)
私设分行;
}
@实体
@表(name=“分行”)
公营部门{
@Id@Column(name=“Id”)@GeneratedValue
私有整数id;
@LazyCollection(LazyCollectionOption.FALSE)
@许多酮
@JoinColumn(name=“公司id”)
私营公司;
}
我在HQL中执行时出错

session.createQuery(“从公司中选择新公司(id、名称、分支机构)作为公司”).list()

我在公司有建造师(id、姓名、分公司)

错误是:

2013-12-06 16:28:02警告SqlExceptionHelper:145-SQL错误:1064,SQLState:42000 2013-12-06 16:28:02错误SqlExceptionHelper:147-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在第1行使用公司0上的公司0内部联接分支机构1上的“as col_2_0_”附近的“as col_2_0”


是否已检查hibernate.dial属性。您已经为MySql配置了它

<property name="hibernate.dialect">
  org.hibernate.dialect.MySQLDialect

org.hibernate.dialogue.mysqldialogue

如果要从公司表中选择所有记录,则可以使用以下HQL

Query query = session.getCurrentSession().createQuery("FROM Company AS c");
query.list();
或者,如果您想添加一些条件,那么您的HQL应该是这样的

Query query = session.getCurrentSession().createQuery("SELECT c.id, c.name, c.branchs FROM Company AS c WHERE c.id = :id AND c.branchs = :branchs");
query.setParameter("id", 123);
query.setParameter("branchs", "abc");
query.list();

也许您可以尝试以下注释:

我假设公司是数据的所有者:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn (name = "ID")
private Set<Branch> branchs;

像这样,联接是在Company类的ID列上进行的,这样做的好处是不会创建链接表。

您想在Company表中选择所有记录的ID、名称和分支,还是要选择特定的公司记录?请问您为什么这样做?为什么不干脆从c公司选择c呢?@mabi这是双向映射。所以,如果我在公司id branch中有一个列,如果我想检索所有公司的分支在company pojo中。所以我正在这样做。请建议我在其他方面是否可以这样做。@Ashish我想在公司表中选择所有记录的id、名称和分支。我已经参考了“是”我正在使用org.hibernate.dialent.mysqldialent它不再工作,但有一个例外,即错误的SQL语法使用createQuery()时从公司选择c.id、c.name、c.branchs您只能传递HQL查询,如果要执行本机查询,则应使用hibernate的createSqlQuery()方法。我认为您将HQL查询和本机查询混合在一起。这也是一个HQL查询。我无法实现这一点。请解释一下好吗?要将双向一对多映射到一对多,并将一对多作为拥有方,您必须删除mappedBy元素,并将many-To-one@JoinColumn设置为可插入且可更新为false。更多信息可在文档中找到:,具体见2.2.5.3.1.1。双向的
@ManyToOne
@JoinColumn (name="ID", insertable=false, updatable=false)
private Company company;