JPA: eins-zu-eins + selbstreferentielle + bidirektionale
Ich habe eine Entität namens "Anweisungen". Manchmal die einzelnen Anweisungen nachverfolgen Anweisungen vor und nach es. Zum Beispiel habe ich neue Anweisung B die Fortsetzung von bestehenden Anweisung A Anweisung B ist zu beachten, dass der Unterricht Eine ist die Vorherige Anweisung, while-Anweisung Eine auch zu wissen, dass die Anweisung B ist der nächste nach. Nicht jeder Befehl wird vor und nach dem Unterricht.
, Wie zum implementieren dieser in JPA(EclipseLink): [one-to-one + selbstreferentielle + bidirektionale] Verhältnis?
Bisher (funktioniert nicht) noch ich kam mit dieser:
mysql-db:
CREATE TABLE instructions (
instruction_id int(11) NOT NULL AUTO_INCREMENT,
instruction_title varchar(100) NOT NULL,
instruction_text varchar(999) NOT NULL,
instruction_previous_id int(11) DEFAULT NULL,
PRIMARY KEY (instruction_id),
CONSTRAINT instructions_ibfk_3
FOREIGN KEY (instruction_previous_id)
REFERENCES instructions (instruction_id));
Person:
@Entity
@Table(name = "instructions")
public class Instructions implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "instruction_id")
private Integer instructionId;
@Basic(optional = false)
@Column(name = "instruction_title")
private String instructionTitle;
@Basic(optional = false)
@Column(name = "instruction_text")
private String instructionText;
@JoinColumn(name="instruction_previous_id", referencedColumnName = "instruction_id", nullable = true)
@OneToOne(optional = true)
private Instructions instructionPrevious;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "instructionPrevious")
private Collection<Instructions> instructionNextCollection;
//other properties, setter & getter
}
Derzeit kein problem bei erstellen neuer Unterricht, hatte Fehler beim Lesen
Instructions instruction = em.find(Instructions.class, instructionId);
instruction.getInstructionNextCollection().size(); //error this line
Local Exception Stack:
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'atiits.instructions_instructions' doesn't exist
Error Code: 1146
Call: SELECT t1.instruction_id, t1.instruction_urgent, t1.instruction_uploaded_by, t1.instruction_translate, t1.instruction_title, t1.instruction_type, t1.instruction_translate_received, t1.instruction_is_cancelled, t1.instruction_translate_sent, t1.instruction_had_workorder, t1.instruction_text, t1.instruction_update_date, t1.instruction_update_by, t1.instruction_create_by, t1.instruction_translator, t1.instruction_create_date, t1.instruction_company_id, t1.instruction_previous_id, t1.instruction_status_id FROM instructions_instructions t0, instructions t1 WHERE ((t0.Instructions_instruction_id = ?) AND (t1.instruction_id = t0.instructionNextCollection_instruction_id))
bind => [874]
Query: ReadAllQuery(name="instructionNextCollection" referenceClass=Instructions sql="SELECT t1.instruction_id, t1.instruction_urgent, t1.instruction_uploaded_by, t1.instruction_translate, t1.instruction_title, t1.instruction_type, t1.instruction_translate_received, t1.instruction_is_cancelled, t1.instruction_translate_sent, t1.instruction_had_workorder, t1.instruction_text, t1.instruction_update_date, t1.instruction_update_by, t1.instruction_create_by, t1.instruction_translator, t1.instruction_create_date, t1.instruction_company_id, t1.instruction_previous_id, t1.instruction_status_id FROM instructions_instructions t0, instructions t1 WHERE ((t0.Instructions_instruction_id = ?) AND (t1.instruction_id = t0.instructionNextCollection_instruction_id))")
at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:333)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:687)
- Möglich, Duplikat der stackoverflow.com/questions/3393515/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einige Verwirrung in deinem Beispiel, ob die einzelnen Anweisungen kann gefolgt werden von einer einzelnen Anweisung oder durch viele.
Wenn es ein single, dann verwenden Sie nicht eine Sammlung für instructionNext.
Wenn es viele sind, dann den Beispiel-code in JPA: Wie haben eins-zu-viele-Beziehung von der gleichen Person geben sollte helfen. Sie müssen
@ManyToOne
für den vorhergehenden Unterricht und die@OneToMany
für die folgenden, eher als@OneToOne
.Collection<Instructions>
durchInstructions
- funktioniert das?