Java JPA,Hibernate:仅使用外键的OneTONE映射

Java JPA,Hibernate:仅使用外键的OneTONE映射,java,hibernate,jpa,hibernate-mapping,Java,Hibernate,Jpa,Hibernate Mapping,环境: Hibernate 4.1.6.1最终版本 弹簧3.1.2.释放 Spring JPA 1.1.0.0发布版 PostgreSQL 9.1-901-1.jdbc4 我决定重新措辞这些问题 共有两个表格: public company { private Long id; private Long name; private address table_address; } public address { private Long id; private Stri

环境:

  • Hibernate 4.1.6.1最终版本
  • 弹簧3.1.2.释放
  • Spring JPA 1.1.0.0发布版
  • PostgreSQL 9.1-901-1.jdbc4
我决定重新措辞这些问题

共有两个表格:

public company
{
  private Long id;
  private Long name;
  private address table_address;
}
public address
{
  private Long id;
  private String address;
  private Long company_id;
}
注意:两个表id都是连续的,没有关联。除了
表。地址。公司id
是公司的外键

如何进行映射?我期望的结果是:

"company":{
            "id":4,
            "name":"company name",
            "address":{
                         "id":3,
                         "address":"anywhere",
                         "company_id":4
                      }
          }

有人能教我如何映射这个2表吗?

您应该创建两个实体类,如下所示

公司实体

    @Entity
    @Table(name = "YOUR TABLE NAME")
    public company{

       @Id
       @GeneratedValue(strategy = GenerationType.IDENTITY)
       @Basic(optional = false)
       @Column(name = "COMPANY_ID")
       private Long id;
       @Column(name = "NAME")
       private Long name;
       @JoinColumn(name = "ADDRESS_ID")
       @OneToOne(optional = false)
       private address table_address;
    }
地址实体

   @Entity
   @Table(name = "YOUR TABLE NAME")
   public address{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    private Long id;
    @Column(name = "ADDRESS")
    private String address;
    @JoinColumn(name = "COMPANY_ID")
    @OneToOne(optional = false)
    private Long company_id;
}

希望这对您有所帮助

您需要的是
公司
地址

只需将
@OneToOne
注释添加到公司类的table_地址字段:

 public class Address {

        @Id
        @GeneratedValue
        private Long id;
        private String address;
        @OneToOne
        @PrimaryKeyJoinColumn
        private Company company;

        //getters and setters
    }

public class Company {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToOne(mappedBy = "company",cascade = CascadeType.ALL)
    private Address companyAddress;

    //getters and setters
}
除了问题之外: 遵守java命名约定,在您的例子中,类名应该以大写字母开头,变量名中的下一个单词也应该以大写字母开头。i、 e.公司应为公司,地址应为地址
私人地址表\u地址更改为
私人地址公司地址

更新的解决方案

public class Address {

    @Id
    @GeneratedValue
    private Long id;
    private String address;
    @OneToOne
    @JoinColumn(name = "company_id")
    private Company company;

    //getters and setters
}

public class Company {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    @OneToOne(mappedBy = "company",cascade = CascadeType.ALL)
    private Address companyAddress;

    //getters and setters
}
来自stupidfrog:如果您使用@PrimaryKeyJoinColumn,则id连接错误。id与两个主要但不是地址表company\u id连接

这是来自hibernate的参考
示例1

您好,在您的公司实体@JoinColumn(name=“ADDRESS\u ID”)中,ADDRESS\u ID来自何处?ADDRESS\u ID是您的地址表的列名,它映射到上面地址类中的ID。如果您遇到错误/异常,请提供错误/异常。在ADDRESS表中,公司ID字段名可以是任意,这些表是如何连接的?@Stupidfrog您提到的table.address.company\u id是公司的外键。所以
address
的company\u id的数据类型和
company
类的id应该是相同的。ya,它是外键,但在表实体中,没有任何注释来声明company\u id是company.id外键。但是,即使使用提供的方法u,也会提示此错误:列company.address_id不存在。我刚刚找到了解决方案,它与我们的解决方案接近90%。唯一不同的是@PrimaryKeyJoinColumn开关切换到@JoinColumn(name=“company\u id”),用于您的解决方案。我将稍后测试并更新also@AbhishekNayak如果我使用您更新的解决方案进行一对一映射。外键
company\u id
未插入
Address
表中。你能帮忙吗。