【问题标题】:Hibernate one-to-one mapping with subclass composite columnHibernate 与子类复合列的一对一映射
【发布时间】:2017-04-08 10:22:57
【问题描述】:

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

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

        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_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 中,而不是在公司表中创建的公司 id。所有其他详细信息正确存储。 那么如何在POJO中为上述表结构设置一对一映射呢?

【问题讨论】:

    标签: java hibernate spring-mvc jpa


    【解决方案1】:

    已编辑:

    如果你想为 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-association-by-common-primary-ke

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

     @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 中设置公司值 CompanyDetail 和 companyDetail 值,如下所示,

    在公司

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

    CompanyDetail 中类似

    public void setCompany(Company company){
       company.setCompanyDetail(this);
       this.company = company;
    }
    

    【讨论】:

    • 我还想在公司详细信息表中自动生成行 ID。在这种情况下,需要进行哪些更改?
    • 你的意思是你想为 CompanyDetail 生成单独的主键
    • 是的,萨加尔。我想要一个单独的 CompanyDetail 主键
    • 它不工作。错误:“company_id”列中的空值违反非空约束公司保存时出现异常。
    • 在我提到的关系更改设置器上使用级联,也将@GenerateValue 添加到 Company 中的 companyId
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2011-07-04
    • 2014-05-25
    • 2021-08-18
    • 2012-04-21
    相关资源
    最近更新 更多