Hi,
We've a legacy database and we need to map some associations with composite keys and repeated columns. Here is an example:
Contract class:
Code:
@Entity
@Table(name = "CONTRACT")
public class Contract {
@ManyToOne
@JoinColumnsOrFormulas( {
@JoinColumnOrFormula(formula = @JoinFormula("CDT_COMPANY_CODE")),
@JoinColumnOrFormula(formula = @JoinFormula("CDT_MFG_CODE")),
@JoinColumnOrFormula(column = @JoinColumn(name = "CDT_MDL_CODE")) })
public Model getModel() {...}
@ManyToOne
@JoinColumnsOrFormulas( {
@JoinColumnOrFormula(formula = @JoinFormula(value="CDT_COMPANY_CODE")),
@JoinColumnOrFormula(column = @JoinColumn(name = "CDT_MFG_CODE")) })
public Manufacturer getManufacturer() {...}
@Column(name = "CDT_COMPANY_CODE")
public Integer getCompanyCode() {...}
@Id
@Column(name = "CDT_CONTRACT_NBR")
public String getContractNumber() {...}
}
Manufacturer class:
Code:
@Entity
@Table(name = "MANUFACTURER")
public class Manufacturer {
@Column(name = "MFG_NAME")
public String getName() {...}
@Id
public ManufacturerId getId() {...}
}
ManufacturerId class:
Code:
@Embeddable
public class ManufacturerId implements Serializable {
@Column(name = "MFG_COMPANY_CODE")
public Integer getCompanyCode() {...}
@Column(name = "MFG_CODE")
public Integer getManufacturerCode() {...}
}
Model class:
Code:
@Entity
@Table(name="MODEL")
public class Model {
@Id
public ModelId getId() {...}
@Column(name="MDL_NAME")
public String getName() {...}
}
ModelId class:
Code:
@Embeddable
public class ModelId implements Serializable {
@Column(name = "MDL_COMPANY_CODE")
public Integer getCompanyCode() {...}
@Column(name = "MDL_MFG_CODE")
public Integer getManufacturerCode() {...}
@Column(name = "MDL_CODE")
public String getModelCode() {...}
}
This is actually working. So, I go further and try to set the "referencedColumnName" in each @JoinColumnOrFormula, like this:
Code:
@ManyToOne
@JoinColumnsOrFormulas( {
@JoinColumnOrFormula(formula = @JoinFormula(value = "CDT_COMPANY_CODE", referencedColumnName = "MDL_COMPANY_CODE")),
@JoinColumnOrFormula(formula = @JoinFormula(value = "CDT_MFG_CODE", referencedColumnName = "MDL_MFG_CODE")),
@JoinColumnOrFormula(column = @JoinColumn(name = "CDT_MDL_CODE", referencedColumnName = "MDL_CODE")) })
public Model getModel() {...}
Doing this I get the following exception:
Quote:
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.cfg.Ejb3JoinColumn.overrideFromReferencedColumnIfNecessary(Ejb3JoinColumn.java:574)
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:332)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:111)
at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:502)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:484)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:334)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1359)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:858)
at hibernateproofofconcept.Hibernate_3_5.main(Hibernate_3_5.java:16)
Am I doing something wrong?
Thanks in advance,
edgar