Ich habe einige Schwierigkeiten haben, mit Tabellen in der Datenbank durch JPA Erzeugung und Anmerkungen Hibernate.Hibernate/JPA Wie falsch Generierung von Datenbanktabellen von Unterklassen zu beheben
Wenn der Code ausgeführt wird unten Er erzeugt die Tabellen mit den folgenden EER-Diagramm.
Dies ist nicht, wie ich es die Tabellen erstellt werden soll. Zunächst sind die Beziehungen zwischen den Tabellen falsch, sie müssen OneToOne und nicht OneToMany sein. Zweitens möchte ich nicht, dass E-Mail der primäre Schlüssel in Schüler und Lehrer ist.
In Student sollte die ovNumber Primärschlüssel sein und in dem Lehrer der employeeNumber Ich habe es zu tun versucht, mit der @Id
Anmerkung, aber das gibt mir die folgende Fehlermeldung:
org.hibernate.mapping.JoinedSubclass cannot be cast to org.hibernate.mapping.RootClass
Wenn ich versuche @MappedSuperClass
die Tabelle zu verwenden, Person erzeugt nicht, auch wenn Sie @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
verwenden.
Nun meine Frage,
Wie kann ich eine andere Variable in Subklassen der Primärschlüssel für die Tabelle corrosponding während des übergeordneten Klasse Primärschlüssel als Fremdschlüssel zu halten?
Wie behebe ich die Beziehung zwischen den Tabellen eine OneToOne Beziehung zu sein, anstatt eine OneToMany Beziehung? Hier
ist ein EER Diagramm, wie es sein sollte.
Im Folgenden sind die Modellklassen, die verwendet werden, um die Tabellen zu erzeugen.
Person.java
@Entity
@Polymorphism(type=PolymorphismType.IMPLICIT)
@Inheritance(strategy=InheritanceType.JOINED)
public class Person implements Comparable<Person>, Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="email", length=64, nullable=false)
private String email;
@Column(name="firstName", length=255)
private String firstName;
@Column(name="insertion", length=255)
private String insertion;
@Column(name="lastName", length=255)
private String lastName;
public Person() {}
/**
* constructor with only email.
*
* @param email
*/
public Person(String email) {
this.email = email;
}
/**
* @param email
* @param firstName
* @param insertion
* @param lastName
*/
public Person(String email, String firstName, String insertion, String lastName){
this.setEmail(email);
this.setFirstName(firstName);
this.setInsertion(insertion);
this.setLastName(lastName);
}
//getters and setters
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getInsertion() {
return insertion;
}
public void setInsertion(String insertion) {
this.insertion = insertion;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public int compareTo(Person o) {
return email.compareTo(o.getEmail());
}
}
Teacher.java
@Entity
@Table(name="teacher")
@PrimaryKeyJoinColumn(name="email", referencedColumnName="email")
public class Teacher extends Person {
private static final long serialVersionUID = 1L;
//this needs to be the pk of teacher table
//@Id
@Column(name="employeeNumber", length=6, nullable=false)
private int employeeNumber;
@Column(name="abbreviation", length=6)
private String abbreviation;
public Teacher(){}
/**
* @param employeeNumber
* @param email
* @param firstName
* @param insertion
* @param lastName
*/
public Teacher(int employeeNumber, String email, String firstName, String insertion, String lastName){
super(email, firstName, insertion, lastName);
this.employeeNumber = employeeNumber;
setAbbreviation();
}
public String getAbbreviation() {
return abbreviation;
}
public void setAbbreviation() {
this.abbreviation = getLastName().substring(0, 4).toUpperCase() + getFirstName().substring(0, 2).toUpperCase();
}
public void setAbbreviation(String abbreviation){
this.abbreviation = abbreviation;
}
public int getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(int employeeNumber) {
this.employeeNumber = employeeNumber;
}
@Override
public String toString() {
return "Teacher [abbreviation=" + abbreviation + ", employeeNumber=" + employeeNumber + "]";
}
}
Student.java
@Entity
@Table(name="student")
@PrimaryKeyJoinColumn(name="email", referencedColumnName="email")
public class Student extends Person {
private static final long serialVersionUID = 1L;
@Column(name="cohort")
private int cohort;
//FIXME this needs to be the pk of student table
//@Id
@Column(name="ovNumber", nullable=false)
private int studentOV;
public Student(){}
public Student(int studentOV, int cohort, String email, String firstName,
String insertion, String lastName) {
super(email, firstName, insertion, lastName);
this.studentOV = studentOV;
this.cohort = cohort;
}
public int getCohort() {
return cohort;
}
public void setCohort(int cohort) {
this.cohort = cohort;
}
public int getStudentOV() {
return studentOV;
}
public void setStudentOV(int studentOV) {
this.studentOV = studentOV;
}
@Override
public int compareTo(Person o) {
return getEmail().compareTo(o.getEmail());
}
@Override
public String toString() {
return "Student [firstName=" + getFirstName() + ", insertion=" + getInsertion() + ", lastName=" + getLastName() + ", email="
+ getEmail() + ", cohort=" + getCohort() + ", studentOV=" + getStudentOV() + "]";
}
}
dies nicht zu funktionieren scheint, ich weiß, dass dies der richtige Weg ist, es zu tun, wenn Sie erstrecken sich nicht die Klasse Person. Die Klassen "Lehrer" und "Schüler" erweitern jedoch die Klasse "Person". –