使用Hibernate注释持久化数据

时间:2012-01-23 10:43:39

标签: hibernate

我对休眠很新。

我有以下表格:

合同

ContractID(PK), 其他栏目

提供商
ProviderID(PK), 其他栏目

ContractualAgreement ContractualAgreementID(PK), ContractID(FK), ProviderID(FK), 其他栏目

我正在使用以下hibernate注释:

 **Contract.java**

    {

    private List<ContractualAgreement> contractualAgreements = new ArrayList<ContractualAgreement>();

    @OneToMany(cascade= { javax.persistence.CascadeType.ALL },fetch= FetchType.LAZY)
    @JoinColumn (name="ContractID", updatable=false,insertable=false)
    public List<ContractualAgreement> getContractualAgreements() {
            return this.contractualAgreements;
        }
    }

 **Provider.java**
{
    private List<ContractualAgreement> contractualAgreements = new     ArrayList<ContractualAgreement>();

    @OneToMany(cascade= { javax.persistence.CascadeType.ALL },fetch= FetchType.LAZY)
    @JoinColumn (name="ProviderID", updatable=false,insertable=false,nullable=false)
    public List<ContractualAgreement> getContractualAgreements() {
            return this.contractualAgreements;
        }
    }
}

 **ContractualAgreement.java**
{
    @Id
    @Column(name = "ContractualAgreementID", unique = true, nullable = false)
    public long getContractualAgreementId() {
        return this.contractualAgreementId;
    }

    public void setContractualAgreementId(long contractualAgreementId) {
        this.contractualAgreementId = contractualAgreementId;
    }

    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "ProviderID",updatable=false,insertable=false,nullable=false)
    public Provider getProvider() {
        return this.provider;
    }

    public void setProvider(Provider provider) {
        this.provider = provider;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="ContractID",updatable=false,insertable=false,nullable=false)
    public Contract getContract() {
        return this.contract;
    }
}

我按以下顺序填充数据:

  1. contractualagreement对象上的合同对象。
  2. 提供商处的contractualagreements列表。
  3. 我尝试使用saveOrUpdate保存提供程序。

    现在它确实将提交者,contractualagreement表中的数据与contractualagreemtent表中的适当的providerid一起保存,但它不会将数据保存在合同表中。

    有谁可以指出我做错了什么?

    任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

你做错了很多事。

首先;合同协议表只是一个连接表。它没有任何其他功能列,因此用于实现合同和提供者之间的关联。因此,这个表应该

  • 没有身份证明
  • 具有包含两个FK
  • 的复合PK
  • 未被映射为实体

您应该在Contract和Provider之间建立ManyToMany关联。 ManyToMany关联将使用ContractualAgreement表进行映射。

代码中的其他问题:

  • 您将所有内容标记为insertable = false, updateable = false。如果没有任何东西可以插入或更新,那么这些列将如何填充?
  • OneToMany双向关联应该使用JoinColumn映射多个边。另一方应该说:“这个关联已经映射到另一方”,使用OneToMany(mappedBy = "thePropertyOnTheOtherSide")

所有这些都在Hibernate参考手册中有详细描述。 Read it