Search code examples
javahibernatehibernate-mapping

Hibernate: Facing "broken column mapping for id" using composite key referenced in another entity


I'm facing problem in creating one to one mapping in Hibernate. Following is how i'm trying to achieve it.

Following is my super class for SysEntity

@MappedSuperclass
public class BaseSysEntity {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

@Column(name="sysupdate")
private Date sysupdate;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public Date getSysupdate() {
    return sysupdate;
}

public void setSysupdate(Date sysupdate) {
    this.sysupdate = sysupdate;
}

}

Following class is the entity which will create oneToOne relation ship with "Project"

@Entity
@Table(name="sysproject")
public class SysProject extends BaseSysEntity implements Serializable {

@OneToOne(optional=true, fetch= FetchType.LAZY)
@PrimaryKeyJoinColumns({
    @PrimaryKeyJoinColumn(name="sysClientId", referencedColumnName="sysClientId"),
    @PrimaryKeyJoinColumn(name="pProject", referencedColumnName="pProject")
})
private Project project;

public Project getProject() {
    return project;
}

public void setProject(Project project) {
    this.project = project;
}
}

Following is Project class:

@Entity
@Table(name = "tproject")
public class Project {
    @EmbeddedId
    private ProjectID id; // It contains sysClientId and pProject as primary key
    @OneToOne(optional=true, mappedBy="project")
    private SysProject SysProject;

}

ProjectID Class:

@Embeddable
public class ProjectID implements Serializable{

@Column(name="pProject")
private String project;

@Column(name="sysClientId")
private String sysClientId;

public String getProject() {
    return project;
}

public ProjectID(){
    this.sysClientId="0";
}

public ProjectID(Integer number){
    this();
    this.project = number.toString();
}

public void setProject(String project) {
    this.project = project;
}

public String getSysClientId() {
    return sysClientId;
}

public void setSysClientId(String sysClientId) {
    this.sysClientId = sysClientId;
}
}

Exception which i'm getting:

Caused by: org.hibernate.MappingException: broken column mapping for: SysProject.id of: com.spin.integration.dto.Project
at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:178)
at org.hibernate.persister.entity.AbstractPropertyMapping.initIdentifierPropertyPaths(AbstractPropertyMapping.java:249)
at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:222)
at org.hibernate.persister.entity.AbstractEntityPersister.initOrdinaryPropertyPaths(AbstractEntityPersister.java:2434)
at org.hibernate.persister.entity.AbstractEntityPersister.initPropertyPaths(AbstractEntityPersister.java:2471)
at org.hibernate.persister.entity.AbstractEntityPersister.postConstruct(AbstractEntityPersister.java:3766)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:451)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:163)
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:135)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:386)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1790)
at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:914)
... 18 more

NOTE: This oneToOne mapping is not present at database level (Unfortunately i can't make changes to database).


Solution

  • You can check this solution its working : One Id of composite key to be referenced in another entity he's facing the same issue

    @OneToOne(optional=true, fetch= FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name="sysClientId", referencedColumnName="sysClientId"),
        @JoinColumn(name="pProject", referencedColumnName="pProject")
    })