双向映射一对多

时间:2013-12-06 11:14:35

标签: 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") @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;
}

我在HQL中执行时遇到错误

  

session.createQuery(“从公司选择新公司(id,名称,分支)作为公司”)。list()

我在公司公司(id,name,branchs)有构造函数

错误是:

  

2013-12-06 16:28:02 WARN SqlExceptionHelper:145 - SQL错误:1064,SQLState:42000   2013-12-06 16:28:02错误SqlExceptionHelper:147 - 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在公司company0_ inner join branch branchs1_ on company0_.ID = b'第1行附近使用“as col_2_0_”附近的正确语法

Apache Tomcat Error Apache tomcat error

3 个答案:

答案 0 :(得分:0)

您检查过hibernate.dialect属性吗?您是否为MySql配置了它。

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

答案 1 :(得分:0)

如果要从Company表中选择所有记录,则可以使用以下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();

答案 2 :(得分:0)

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

我认为公司是数据的所有者:

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

在Branch类中,我将按如下方式注释公司实例变量:

@ManyToOne
@JoinColumn (name="ID", insertable=false, updatable=false)
private Company company;

就像这样,您可以在公司类的ID列上进行连接,并且您可以获得没有创建链接表的好处。