Complex Id and Joined Inheritance
dabubble Jun 17, 2006 3:04 AMHi!
I hava two classes that have the following structure:
@Entity
@SequenceGenerator(name = "crawlerdocument_sequence", sequenceName = "crawlerdocument_id_seq")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class CrawlerDocument implements Serializable {
//The states a document can have in the DB
/**
* This state transcribes the normal state of a document
*/
public static final int IDLE = 0;
/**
* This state transcribes that the document is being crawled/indexed
*/
public static final int UPDATING_REPOSITORY = 1;
/**
* This state transcribes the document has been updated in the filesystem
*/
public static final int UPDATED = 2;
/**
* This state transcribes the document has not been changed in the file system
*/
public static final int NOT_CHANGED = 3;
/**
* This state transcribes the document has been created int he file system
*/
public static final int INSERTED = 4;
protected Permissions permissions;
protected Repository repository;
private int state;
private Long id;
public CrawlerDocument(){}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "crawlerdocument_sequence")
public Long getId() {
return id;
}
@Column(length = 2700)
public Permissions getPermissions(){
return this.permissions;
}
public void setPermissions(Permissions permissions){
this.permissions = permissions;
}
@ManyToOne(targetEntity = Repository.class , optional=false,fetch = FetchType.EAGER)
public Repository getRepository(){
return this.repository;
}
public void setRepository(Repository repository){
this.repository = repository;
}
public void setState(int state){
this.state = state;
}
public int getState(){
return this.state;
}
public void setId(Long id) {
this.id = id;
}
}
A another class that extends this class:
@Entity
@IdClass(FileSystemCrawlerDocumentPK.class)
public class FileSystemCrawlerDocument extends CrawlerDocument{
private static final long serialVersionUID = 4457330551129440853L;
private String fullPath;
private String rootPath;
private String fileName;
private String repositoryRelativePath;
private Date lastChanged;
public FileSystemCrawlerDocument(){}
/**
* Contructor to be used only for directories, though they are not saved we can process
* the path in order to keep the part after the root path
* @param fullPath
* @param rootPath
*/
public FileSystemCrawlerDocument(String fullPath,String rootPath){
this.fullPath = fullPath;
this.rootPath = rootPath;
this.repositoryRelativePath = fullPath.substring(rootPath.length());
this.permissions = new Permissions();
}
/**
* Contructor to be used for the processed files these inherit both the permissions
* and the relative path of the parent directory
* @param parent
* @param fileName
*/
public FileSystemCrawlerDocument(FileSystemCrawlerDocument parent, String fileName){
this.fileName = fileName;
this.repositoryRelativePath = parent.getRepositoryRelativePath();
this.permissions = parent.getPermissions();
}
@Transient
public String getFullPath() {
return fullPath;
}
public void setFullPath(String fullPath) {
this.fullPath = fullPath;
}
@Transient
public String getRootPath() {
return rootPath;
}
public void setRootPath(String rootPath) {
this.rootPath = rootPath;
}
@Id
@Column(length = 1500)
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Id
@Column(length = 2700)
public String getRepositoryRelativePath() {
return repositoryRelativePath;
}
public void setRepositoryRelativePath(String repositoryRelativePath) {
this.repositoryRelativePath = repositoryRelativePath;
}
public String toString() {
return "FileSystemCrawlerDocument{" +
"fullPath='" + fullPath + '\'' +
", rootPath='" + rootPath + '\'' +
", fileName='" + fileName + '\'' +
", repositoryRelativePath='" + repositoryRelativePath + '\'' +
", repository=" + repository +
", permissions=" + permissions +
'}';
}
@Temporal(TemporalType.TIMESTAMP)
public Date getLastChanged() {
return lastChanged;
}
public void setLastChanged(Date lastChanged) {
this.lastChanged = lastChanged;
}
}
This second class uses the following id class:
public class FileSystemCrawlerDocumentPK implements Serializable {
private String fileName;
private String repositoryRelativePath;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getRepositoryRelativePath() {
return repositoryRelativePath;
}
public void setRepositoryRelativePath(String repositoryRelativePath) {
this.repositoryRelativePath = repositoryRelativePath;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final FileSystemCrawlerDocumentPK that = (FileSystemCrawlerDocumentPK) o;
if (!fileName.equals(that.fileName)) return false;
if (!repositoryRelativePath.equals(that.repositoryRelativePath)) return false;
return true;
}
public int hashCode() {
int result;
result = fileName.hashCode();
result = 29 * result + repositoryRelativePath.hashCode();
return result;
}
}
The objective is to map to a DB model a bit like this
Table CrawlerDocument
id, int , sequence, pk
attr 1
attr 2
Table FileSystemCrawlerDocument
id (from CrawlerDocument), int , sequence, pk, fk
fileName, pk
relativeRootPath, pk
attr3
attr4
I can't seem to get this to work.
I gives me the following error:
org.hibernate.AnnotationException: Unable to define/override @Id(s) on a subclass: com.criticalsoftware.search.entities.FileSystemCrawlerDocument
I'm using Jboss 4.0.4 GA with EJB3
Any help would be very much appreciated.