Mapping Exception for subclass with inherited composite key
jluv Nov 12, 2006 6:39 PMI'm getting the error below for what I believe to be a valid mapping. Am I doing something wrong? Any ideas?
org.hibernate.MappingException: Foreign key (FKFA49A91FAB488FB6:billing_document_lines [line_number])) must have same number of columns as the referenced primary key (document_lines [line_number,document_id])
Here's the code:
BillingDocument.java
package document;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "billing_documents")
public class BillingDocument extends Document {
private static final long serialVersionUID = 1L;
}
BillingDocumentLine.java
package document;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "billing_document_lines")
public class BillingDocumentLine extends DocumentLine {
private static final long serialVersionUID = 1L;
public BillingDocumentLine(BillingDocument document, short lineNumber) {
super(document, lineNumber);
}
BillingDocumentLine() {
}
}
Document.java
package document;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "documents")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Document implements Serializable {
private static final long serialVersionUID = 1L;
protected String documentID;
protected Document() {
}
protected Document(String documentID) {
setDocumentID(documentID);
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result
+ ((documentID == null) ? 0 : documentID.hashCode());
return result;
}
@Override
public boolean equals(Object object) {
if (object instanceof Document) {
final Document document = (Document) object;
if (documentID != null) {
return documentID.equals(document.documentID);
}
}
return false;
}
@Override
public String toString() {
return documentID;
}
@Id
@Column(name = "document_id")
public String getDocumentID() {
return documentID;
}
protected void setDocumentID(String documentID) {
this.documentID = documentID;
}
}
DocumentLine.java
package document;
import java.io.Serializable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "document_lines")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class DocumentLine implements Serializable {
private static final long serialVersionUID = 1L;
protected DocumentLinePK primaryKey;
protected DocumentLine(Document document, short lineNumber) {
setPrimaryKey(new DocumentLinePK(document, lineNumber));
}
protected DocumentLine() {
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result
+ ((primaryKey == null) ? 0 : primaryKey.hashCode());
return result;
}
@Override
public boolean equals(Object object) {
if (object instanceof DocumentLine) {
final DocumentLine documentLine = (DocumentLine) object;
if (primaryKey != null) {
return primaryKey.equals(documentLine.primaryKey);
}
}
return false;
}
@Override
public String toString() {
return primaryKey.toString();
}
@EmbeddedId
public DocumentLinePK getPrimaryKey() {
return primaryKey;
}
protected void setPrimaryKey(DocumentLinePK primaryKey) {
this.primaryKey = primaryKey;
}
}
DocumentLinePK.java
package document;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Embeddable
public class DocumentLinePK implements Serializable {
private static final long serialVersionUID = 1L;
private Document document;
private short lineNumber;
public DocumentLinePK(Document document, short lineNumber) {
setDocument(document);
setLineNumber(lineNumber);
}
DocumentLinePK() {
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result
+ ((document == null) ? 0 : document.hashCode());
result = PRIME * result + lineNumber;
return result;
}
@Override
public boolean equals(Object object) {
if (object == null) {
return false;
}
if (getClass() == object.getClass()) {
final DocumentLinePK primaryKey = (DocumentLinePK) object;
if (document != null && lineNumber != 0) {
return document.equals(primaryKey.document)
&& lineNumber == primaryKey.lineNumber;
}
}
return false;
}
@Override
public String toString() {
return document.toString() + ":" + lineNumber;
}
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "document_id")
public Document getDocument() {
return document;
}
@Column(name = "line_number")
public short getLineNumber() {
return lineNumber;
}
protected void setDocument(Document document) {
this.document = document;
}
protected void setLineNumber(short lineNumber) {
this.lineNumber = lineNumber;
}
}