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

具有子类复合列的HiberNate一对一映射

勾长卿
2023-03-14

我有两个表,第一个表包含公司id、公司名称和国家名称,第二个表包含公司相关的详细信息和一对一的映射。

我想使用Hibernate进行以下映射:-

        company {
          company_id int,
          company_name varchar,
          country varchar
        }

        company_detail {
          id int,
          company_id int,
          company_description text,
          future_goal text
        }

公司表的Company_id应该映射company_detail表的company_id,所以我在POJO中设置了以下映射

     In Company POJO :-
         @OneToOne(cascade=CascadeType.ALL)
         @JoinColumn(name="COMPANY_ID")  
         private CompanyDetails companyDetails;

        In CompanyDetails POJO :-
        @Column(name="COMPANY_ID", nullable=false)  
        public Company company;

另外,在setter中添加以下代码:-

public void setCompanyDetails(CompanyDetails companyDetails) {
        companyDetails.setCompany(this);
        this.companyDetails = companyDetails;
    }

这段代码运行良好,在保存公司时只有一个问题,null存储在company_detal的company_id中,而不是存储在company表中创建的company id中。所有其他细节妥善保存。那么,如何在POJO中为上述表结构设置一对一映射呢?

共有1个答案

单于阳
2023-03-14

编辑:

如果您想为CompanyDetail生成单独的主键,那么它就如下面所示

 @Id  
 @GeneratedValue  
 @Column(name="COMPANY_DETAIL_ID", unique = true, nullable = false) 
 public int companyDetailId;

 @OneToOne  
 @PrimaryKeyJoinColumn(name="COMPANY_ID")  
 public Company company;

######################################################################

参考此链接hibernate-jpa-onetoone-关联-通过-共同-主-克

您必须在公司中使用共享主键生成器详细信息如下

 @Id  
 @GeneratedValue(generator="SharedPrimaryKeyGenerator")  
 @GenericGenerator(name="SharedPrimaryKeyGenerator",strategy="foreign",parameters = @Parameter(name="property", value="company"))  
 @Column(name="COMPANY_ID", unique = true, nullable = false)  
 public int companyId;

 @OneToOne  
 @PrimaryKeyJoinColumn  
 public Company company;

在你的陪伴下

  @OneToOne(cascade=CascadeType.ALL)  
  @PrimaryKeyJoinColumn(referencedColumnName="Company_ID")  
  public CompanyDetail companyDetail

另外,请确保您将company value CompanyDetail和company中的CompanyDetail值设置为:,

陪伴

public void setCompanyDetail(CompanyDetail companyDetail){
   companyDetail.setCompany(this);
   this.companyDetail = companyDetail;
}

在CompanyDetail中也是如此

public void setCompany(Company company){
   company.setCompanyDetail(this);
   this.company = company;
}
 类似资料:
  • 问题内容: 我必须制作一个拼贴项目的域层。我们几乎没有标准,例如我们必须使用Hibernate,数据库也已修复。 数据库的相关部分几乎如下所示: 总线实体 (表1) 总线编号 公交专用信息 总线类型 (表2) BusTypeId 座位数 … 子类鉴别器 我遇到的问题是,在域层中有2种类型的总线通过BusType表中的标识符进行区分: 有没有办法用Hibernate和JPA映射类似的东西?谢谢你的回

  • 我有两个表模式 员工 地址

  • 我想查询使用hibernate通过内连接连接的两个表。 以下是两个表格。 创建表(INT(20)非空AUTO_INCREMENT,VARCHAR(50)非空默认'0',主键() ) 创建表(INT(20)非空,INT(20)非空默认值“0”,主键(),约束外键()引用) 这两个表具有一对多关系。 这些束的豆类如下。 但我在说 “……构造函数引发异常;嵌套异常为org.hibernate.Mappi

  • 我很难在Hibernate上映射以下数据库模式: 是一个现有的表,它已经映射到Java类上。表是最近创建的,它只有两列。这两列都是复合主键的一部分。列引用表上的列,而只是一个不引用数据库上任何列的松散id。 请注意,数据库表和列名与Java类和属性名并不完全相同。e、 g.java类名为顺序,表名为tb\u顺序。我认为这一点很重要,因为Hibernate推断出的表/列名可能不匹配(表列也是snak

  • notification_detail-单个主键 我想使用JPA持久化和读取这些对象,但无法使ManyToOne映射工作。 许多通知映射到一个notification_detail。 我试过所有类型的不同配置。我能想到的最好的办法是,我的情况很复杂,因为父对象“notification_detail_id”有一个复合键“notification_detail_id”,它也是子对象的主键。这使得Hi

  • 问题内容: 我正在尝试在Hibernate中将一对一关系映射为“零或一个”关系。我想我可能已经找到了使用多对一方法。 A类的映射指定: B类的映射指定: 我想在数据库中找不到B的匹配行时b为null。所以我可以做到这一点(在A类中): 但是,看来b永远不会为空。 我该怎么办? 问题答案: 答案是在A中的多对一语句中添加not-found =“ ignore”: 我尝试按照Rob H的建议,简单地向