One to many hibernate join if column names are different

40,737

Solution 1

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/

Solution 2

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>();
Share:
40,737
Pramod Kumar
Author by

Pramod Kumar

I am a software developer and am very enthusiastic for java.

Updated on June 23, 2020

Comments

  • Pramod Kumar
    Pramod Kumar about 4 years

    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.