So, I'm not sure how to ask this question, as it seems like it should be pretty easy to find the answer to this one.
I have 3 tables; ContentHeader, ContentType1 and ContentType2. ContentHeader has a primary, auto-increment key. ContentType1 and ContentType2 both maintain foreign keys to ContentHeader's primary key. These foreign keys are also the primary keys for their respective tables.
CREATE TABLE contentHeader (contentID INT AUTO_INCREMENT PRIMARY KEY, ...) ENGINE=InnoDB;
CREATE TABLE contentType1 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB;
CREATE TABLE contentType2 (contentID INT PRIMARY KEY, FOREIGN KEY (contentID) REFERENCES contentHeader (contentID), ...) ENGINE=InnoDB;
I have created four classes:
@Entity
public class ContentHeader {
@Id
@GeneratedValue
protected int contentID;
...
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Content {
@Id
@OneToOne
protected ContentHeader contentHeader;
...
}
@Entity
public class ContentType1 extends Content {
...
}
@Entity
public class ContentType2 extends Content {
...
}
This throws a null pointer when trying to generate the schema. I'm pretty sure I'm just missing something simple. I noticed the PrimaryKeyJoinColumn, but I'm not sure if it's what I need or not.
With an entity, make sure that you specify the primary key in the class hierarchy. When you specify the primary key, follow the below rules: For a simple (not complex type) primary key, specify @Id in the persistence field or persistence property or specify the key in the O/R mapping file.
Simple primary keys use the javax.persistence.Id annotation to denote the primary key property or field. Composite primary keys are used when a primary key consists of more than one attribute, which corresponds to a set of single persistent properties or fields.
Each entity type will typically use its own row in the table to generate the primary key values for that entity class. Primary key values are positive integers. A primary key generator, which you can reference by name, defined at one of the package, class, method, or field level.
You can create a composite id class that only has the ContentHeader:
@Embeddable
public class ContentKey implements java.io.Serializable {
@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
@JoinColumn(name = "ID", updatable = true)
private ContentHeader header;
// ...
}
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Content {
@Id
public ContentKey getContentKeyId()
// ...
}
That should do the trick.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With