当前位置: 首页 > 知识库问答 >
问题:

Hibernate:@JoinTable

袁运良
2023-03-14

我已经理解了hibernate中的@joincolumn。现在我已经从@JoinTable开始了。以下是我的POJO

@Entity
@Table(name = "person")
public class Person {

    @Id
    @GeneratedValue
    @Column(name = "person_id")
    private long person_id;


    @Column(name = "name")
    private String name;


    @Column(name = "Address")
    private String Address;


    @OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)  
        @JoinTable(name="person_phone",  
        joinColumns={@JoinColumn(name="person_id", referencedColumnName="person_id")},  
        inverseJoinColumns={@JoinColumn(name="phone_id", referencedColumnName="phone_id")})  
    private Phone phone;

        //Getters ande Setters

}


@Entity
@Table(name = "phone")
public class Phone{

    @Id
    @GeneratedValue
    @Column(name = "phone_id")
    private long phone_id;


    @Column(name = "name")
    private String name;


        //Getters ande Setters


}

在我的控制器中,我完成了以下操作

 @RequestMapping(value = "/persons", method = RequestMethod.GET)
    public List<person> listPersons() {     

        StringBuilder sql = new StringBuilder();
        sql.append("SELECT * FROM person);  
        Query query = getSession().createSQLQuery(sql.toString()).addEntity(Person.class);
        return query.list();
    }

当我以Select*from person执行时,出现以下错误

o.h.e.jdbc.spi错误。SqlExceptionHelper-在此结果集中找不到列名phone_id。

我想实现的是,当我从人员表中检索记录时,我也希望相应的电话详细信息。

共有2个答案

高建本
2023-03-14
@Entity
@Table(name = "person")
public class Person implements java.io.Serializable {

    private long personId;  
    private String name;    
    private String address;
    private Phone phone;    

    public Person () {
    }

    @Id
    @GeneratedValue
    @Column(name = "person_id") 
    public BigDecimal getPersonId() {
        return this.personId;
    }

    @Column(name = "name")  
    public BigDecimal getName() {
        return this.name;
    }

    @Column(name = "Address")
    public BigDecimal getAddress() {
        return this.address;
    }

    @OneToOne(cascade=CascadeType.ALL,fetch = FetchType.EAGER)  
        @JoinTable(name="person_phone",  
        joinColumns={@JoinColumn(name="person_id", referencedColumnName="person_id")},  
        inverseJoinColumns={@JoinColumn(name="phone_id", referencedColumnName="phone_id")})  
    public Phone getPhone() {
        return this.phone;
    }
    // setter function
}

@Entity
@Table(name = "person_phone")
public class Phone{

    private long personId;
    private String name;

    @Id
    @GeneratedValue
    @Column(name = "person_id")
    public long getPersonId() {
        return this.personId;
    }

    @Column(name = "name")
    public String getName() {
        return this.name;
    }

    //setter function
}
易烨磊
2023-03-14

选择Hibernate createQuery方法而不是createSqlQuery来匹配实体更准确。试试下面;

    StringBuilder sql = new StringBuilder();
    sql.append("FROM Person");  //using hibernate query
    Query query = getSession().createQuery(sql.toString()); //Hibernate query so use createQuery not createSqlQuery
    return query.list();
 类似资料:
  • 在本章中,我们将讨论BeanEditForm和Grid component与Hibernate的集成。 Hibernate通过hibernate模块集成到tapestry中。 要启用hibernate模块,请在pom.xml文件中添加tapestry-hibernate依赖项和可选的hsqldb 。 现在,通过放置在资源文件夹根目录的hibernate.cfg.xml文件配置hibernate。

  • Hibernate是一种高性能的对象/关系持久性和查询服务,它在开源GNU宽通用公共许可证(LGPL)下获得许可,可以免费下载。 在这一章当中。 我们将学习如何实现Struts 2与Hibernate的集成。 如果您不熟悉Hibernate,那么您可以查看我们的Hibernate教程 。 数据库设置 在本教程中,我将使用“struts2_tutorial”MySQL数据库。 我使用用户名“root

  • iBATIS和Hibernate之间存在重大差异。 鉴于其特定领域,这两种解决方案都运行良好。 建议使用iBATIS - 您想创建自己的SQL,并且愿意维护它们。 您的环境由关系数据模型驱动。 您必须处理现有的和复杂的模式。 如果环境由对象模型驱动并且需要自动生成SQL,请使用Hibernate。 iBATIS和Hibernate之间的区别 Hibernate和iBATIS都是业界可用的开源对象关

  • Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java开发中最为流行的数据库持久层框架,现已归JBOSS所有。 它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始

  • 问题内容: 在tomcat 7中部署应用程序时,我从此pom.xml运行mvn tomcat7:run时遇到此错误。在我的依赖项中,我想问题可能是由于相依软件包的混合版本引起的。 这是../../pom.xml: 问题答案: 此类是在4.xx版本中添加的,您将不会在Hibernate 3中找到它 可能是您的Maven依赖关系树中有2个版本。 你需要: 跑 检查您有多少个版本以及哪些其他3rd oa

  • 问题内容: 我有两个实体A和B。 UUID是从外部给出的;ID可以视为版本。 现在,我想在B中引用A,以便将uuid存储在B中,并自动选择具有相应uuid和最高ID的A。 我试过的是: 这将在B中创建一个包含A的ID的列,并在我尝试持久化对象时引发异常。我也尝试过@JoinColumnsOrFormulas,但是没有运气。 有人可以给我一个提示(在Hibernate 3.5 btw中)吗? 谢谢!