6

次の構造を持つ3つのテーブルがあります-

契約 -> contract_id(プライマリ)、customer_company_id、Vendor_company_id

会社 -> Company_id(プライマリ)、creation_date、created_by

Company_Timeline -> Timeline_id(プライマリ)、Company_id、Company_name.

これらのテーブルには次のクラスがあります-

Contract.java

@Table(name = "CONTRACT")
@Entity
@SequenceGenerator(name = "ContractSeq", sequenceName = "SEQCONTRACT", allocationSize = 1)
public class Contract implements Serializable {

    private static final long serialVersionUID = 1L;

    /*
     * General Tab
     */
    @Id
    @Column(name = "CONTRACT_ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ContractSeq")
    private Integer id;

    /*
     * Customer Company Info
     */

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CUSTOMER_COMPANY_ID", nullable = true ,insertable = false,updatable = false)
    @ForeignKey(name = "FK_CONTRACT_CUSTOMER_COMPANY_ID")
    private Company customerCompany;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "VENDOR_COMPANY_ID", nullable = true ,insertable = false,updatable = false)
    @ForeignKey(name = "FK_CONTRACT_CVENDOR_COMPANY_ID")
    private Company vendorCompany;

    //What mapping should i do to get CUSTOMER_COMPANY_ID Timeline list here


    //What mapping should i do to get vendor_COMPANY_ID Timeline list here

}

Company.java

@Entity
@Table(name = "COMPANY")
@SequenceGenerator(name="CompanySeq", sequenceName="SEQ_COMPANY", allocationSize=1)
public class Company implements Serializable {

    private static final long serialVersionUID = 1L;

    /*
     * Customer Company Details 
     */

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanySeq")
    @Column(name = "COMPANY_ID")
    private Integer id;

    @Column(name="CREATION_DATE")
    @Temporal(value=TemporalType.TIMESTAMP)
    private Date creationDate;

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

    @OneToMany(fetch = FetchType.LAZY, orphanRemoval=true)
    @Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
    @JoinColumn(name = "COMPANY_ID",nullable=false)
    @OrderBy(clause = "AS_OFF_DATE" )
    @ForeignKey(name = "PF_COMPANY_TIMELINE")     
    private List<CompanyTimeline> companyTimeline = new ArrayList<CompanyTimeline>();
}

CompanyTimeline.java

@Entity
@Table( name = "COMPANY_TIMELINE")
@SequenceGenerator(name = "CompanyTimelineSeq", sequenceName = "COMPANY_TIMELINE_SEQUENCE")
public class CompanyTimeline {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CompanyTimelineSeq")
    @Column(name = "COMPANY_EVENT_ID")
    private Integer eventId;

    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name = "COMPANY_ID", updatable = false, insertable = false, nullable=false)
    @ForeignKey(name = "FK_COMPANY_ID", inverseName = "COMPANY_ID")
    private Company company;
}

ここで、contract テーブルでマッピング (1 対多) を実行して、customer_company と vendor_company のタイムラインを取得したいと考えています。

ただし、結合列名が同じではないため、Contract テーブルの列名は CUSTOMER_COMPANY_ID、VENDOR_COMPANY_ID ですが、CompanyTimeline クラスの列名は COMPANY_ID です。

Contract.java でこの結合マッピングを作成する方法が少しわかりません。

編集 :

に基づいて、契約テーブルとタイムラインをマッピングしたいと考えていますcontract.customer_company_id = timeline.company_id。何かのようなもの..

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name="COMPANY_ID", referencedColumnName="CUSTOMER_COMPANY_ID")
@Where(clause="to_date(SIGNING_DATE, 'DD-Mon-YY') >= (CASE WHEN event_start_date is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else event_start_date END) AND to_date(SIGNING_DATE, 'DD-Mon-YY') <= (CASE WHEN event_end_date is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else event_end_date END)")
private List<CompanyTimelineView> customerCompanyTimelineView = new ArrayList<CompanyTimelineView>();

これは、熱心な会社なしでタイムライン オブジェクトを直接取得できるように、contract.java でやりたいことです。

4

2 に答える 2

11

参照列名を指定できます

@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")

Hibernateのドキュメント[1]セクション2.2.3.2.1を参照してください

[1] http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

于 2012-06-22T12:38:05.240 に答える
1

列の名前は関係ありません。契約には、ベンダー会社への関連付けと、顧客会社への関連付けがあります。そして、同社はタイムラインとの関連性を持っています。したがって、これ以上何も必要ありません。契約のベンダー会社のタイムラインが必要な場合は、電話してください

contract.getVendorCompany().getTimeLines();

補足: Company と CompanyTimeLine の間の双方向の OneToMany は間違っています。そのはず:

@OneToMany(fetch = FetchType.LAZY, orphanRemoval=true, mappedBy = "company")
@Cascade({org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@OrderBy(clause = "AS_OFF_DATE" )
private List<CompanyTimeline> companyTimeline = new ArrayList<CompanyTimeline>();
于 2012-06-22T12:38:59.120 に答える