Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

One to many hibernate join if column names are different

I have three tables with following structure -

Contract -> contract_id(primary), customer_company_id, Vendor_company_id

Company -> Company_id(primary), creation_date, created_by

Company_Timeline -> Timeline_id(Primary), Company_id, Company_name.

and have following classes for these tables -

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;
}

Now i want to do a mapping(One to Many) in contract table to get customer_company and vendor_company timeline.

But as join column name are not same, Contract table has column name as CUSTOMER_COMPANY_ID, VENDOR_COMPANY_ID but CompanyTimeline class has column name as COMPANY_ID.

I am bit confused how make this join mapping in Contract.java.

EDIT :

I want to map contract table with timeline on the basis of contract.customer_company_id = timeline.company_id. Something like..

@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>();

This is what i want to do in contract.java so that i can get timeline object directly without eager company.

like image 533
Pramod Kumar Avatar asked Jun 22 '12 12:06

Pramod Kumar


2 Answers

You can specify reference column name

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

see Hibernate documentation [1] section 2.2.3.2.1

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

like image 135
Arcadien Avatar answered Sep 20 '22 11:09

Arcadien


The name of the columns are irrelevant. The contract has an association to the vendor company, and an association to the customer company. And the company has an association with its time lines. So you don't need anything more. If you want the time lines of the vendor company of a contract, just call

contract.getVendorCompany().getTimeLines();

Side note: your bidirectional OneToMany between Company and CompanyTimeLine is wrong. It should be:

@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>();
like image 24
JB Nizet Avatar answered Sep 20 '22 11:09

JB Nizet