[jboss-user] [EJB 3.0] - Mapping Exception for subclass with inherited composite key

JLuv do-not-reply at jboss.com
Sun Nov 12 18:39:59 EST 2006


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

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3985287#3985287

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3985287



More information about the jboss-user mailing list