2012-02-16 64 views
1

我有一個名爲'Instructions'的實體。有時每條指令必須跟蹤指令前後的指令。例如,我有新的指令B從現有的指令A繼續,指令B必須知道指令A是前一條指令,而指令A也必須知道指令B是其後的下一條指令。並非每條指令都會在指令之前和之後。JPA:一對一+自我參照+雙向

如何在JPA(EclipseLink)中實現:[one-to-one + self reference + bidirectional] relation?

到目前爲止(不工作還沒有),我想出了這一點:

MySQL數據庫:

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)); 

實體:

@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 
} 

目前在創建新的指令沒有問題,有讀取時出錯

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)

+0

可能的重複http://stackoverflow.com/questions/3393515/jpa-how-to-have-one-to-many-relation-of-the-same-entity-type – perissf 2012-02-16 08:20:53

回答

2

在你的例子中,每個指令是否可以跟隨一條指令或多條指令都有一些混淆。

如果它是一個單一的,那麼不要使用集合作爲下一個指令。

如果很多,那麼JPA: How to have one-to-many relation of the same Entity type中的示例代碼應該有所幫助。對於以下指令,您需要@ManyToOne@OneToMany需要以下指令,而不是@OneToOne

+0

thx爲您的迴應:D ,每條指令只能跟一條指令(一對一),所以我應該用什麼來聲明指令next? – 2012-02-17 14:17:09

+0

只需用'Instructions'替換'Collection ' - 是否有效? – 2012-02-21 14:04:02

+0

是的,它確實:D .... thx爲您的迴應 – 2012-02-27 04:33:58