2014-12-03 123 views
0

我是JAVA和JPA的新手,我搜索瞭解決方案但無濟於事。我發現了很多例子,但他們沒有在我的方案中工作。 我想下面給出這兩個表映射:雙向多對一映射

書架表

CREATE TABLE "SOA2"."BOOKSHELF" ( 
"BOOKSHELF_ID" NUMBER(19,0) NOT NULL ENABLE, 
"NAME_TXT" VARCHAR2(255 CHAR), 
PRIMARY KEY ("BOOKSHELF_ID") USING INDEX PCTFREE 10 INITRANS 2 
MAXTRANS 255 NOCOMPRESS LOGGING 
TABLESPACE "SOA2" ENABLE 
) SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 
MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "SOA2" ; 

書表

CREATE TABLE "SOA2"."BOOK" ( 
"BOOK_IX" NUMBER(19,0) NOT NULL ENABLE, 
"BOOKSHELF_ID" NUMBER(19,0) NOT NULL ENABLE, 
"NAME_TXT" VARCHAR2(255 CHAR), 
PRIMARY KEY ("BOOK_IX", "BOOKSHELF_ID") USING INDEX PCTFREE 10 INITRANS 2 
MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "SOA2" ENABLE, CONSTRAINT "FK_RJWHY4FC" 
FOREIGN KEY ("BOOKSHELF_ID") 
REFERENCES "SOA2"."BOOKSHELF" ("BOOKSHELF_ID") ENABLE) 
SEGMENT CREATION DEFERRED PCTFREE 10 PCTUSED 40 INITRANS 1 
    MAXTRANS 255 NOCOMPRESS LOGGING TABLESPACE "SOA2" ; 

爲了便於理解,下面的結構如下所示

Bookshelf Table and Book Table 經過所有搜索後,我使用Eclipse「JPA Entities from Tables」工具。 它產生以下的課給我:

Bookshelf.java

@Entity 
@Table(name="BOOKSHELF") 
public class Bookshelf implements Serializable { 
    @Id 
    @Column(name="BOOKSHELF_ID", unique=true) 
    private long bookshelfId; 
    @Column(name="NAME_TXT") 
    private String nameTxt; 
    //bi-directional many-to-one association to Book 
    @OneToMany(mappedBy="bookshelf", cascade={CascadeType.ALL}) 
    private List<Book> books; 
    public List<Book> getBooks() { 
     return this.books; 
    } 
    public void setBooks(List<Book> books) { 
     this.books = books; 
    } 
//Code removed for the sake of brevity 
} 

Book.java

@Entity 
    @Table(name="BOOK") 
    public class Book implements Serializable { 
     @EmbeddedId 
     private BookPK id; 
     @Column(name="NAME_TXT", length=255) 
     private String nameTxt; 
     //bi-directional many-to-one association to Bookshelf 
     @ManyToOne(cascade={CascadeType.ALL}) 
     @JoinColumn(name="BOOKSHELF_ID", nullable=false, insertable=false, updatable=false) 
     private Bookshelf bookshelf; 
    //Code removed for the sake of brevity 
    } 

BookPK.java

@Embeddable 
public class BookPK implements Serializable { 
@Column(name="BOOK_IX") 
private long bookIx; 
@Column(name="BOOKSHELF_ID", insertable=false, updatable=false, unique=true, nullable=false) 
private long bookshelfId; 
public BookPK(long bkShlfId, long bkId) { 
    this.bookshelfId = bkShlfId; 
    this.bookIx = bkId; 
} 
//Code removed for the sake of brevity 
只有一本書成功 Test.java

 //Physics Bookshelf 
     Bookshelf physicsShelf = new Bookshelf(); 
     physicsShelf.setNameTxt("Physics"); 
     physicsShelf.setBookshelfId(500); 
     //Add Books 
     Book book1 = new Book(); 
     book1.setNameTxt("God and the Physics"); 
     book1.setId(new BookPK(500, 600)); 

     Book book2 = new Book(); 
     book2.setNameTxt("Hyperspace"); 
     //if I pass 500 as first param in below constructor 
     //Changing 500 to 501 solves the issue 
     book2.setId(new BookPK(500, 600)); //javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [books.Book#[email protected]] 

     //Add Books into list 
     List<Book> bookList = new ArrayList<Book>(); 
     bookList.add(book1); 
     //Error: Following error appears if I uncomment the following line 
     bookList.add(book2); //Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-02291: integrity constraint (SOA2.FK_RJ) violated - parent key not found 
     //Set Books 
     physicsShelf.setBooks(bookList); 
     EntityTransaction transaction = entitymanager.getTransaction(); 
     transaction.begin(); 
     entitymanager.persist(physicsShelf); 
     transaction.commit(); 

physicsShelf插入,如果我在插入第二本書的書目它給了我在錯誤描述:0

}

我測試這是Test.java評論。

請指引我

  1. 什麼,我做錯了,如何糾正它。我很困難。

  2. 有什麼辦法通過註釋其他兩個類來擺脫BookPK.java類。

我不能更改數據庫 我使用Oracle 11g與JPA 2。1

任何幫助將高度讚賞

問候

+0

更換

@EmbeddedId private BookPK id; 

如若BOOKID的第二冊比BOOKID是不同的BOOK1?在上面的代碼中,兩者似乎都與600相同? – 2014-12-03 06:10:57

+0

感謝您的回答。 – 2014-12-03 07:00:27

回答

1

ID應該是唯一的,但在你的情況下,要設置BOOK1和Book在圖書(500,600)

book2.setId(new BookPK(500, 600)); //javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [books.Book#[email protected] 
兩者的ID

所以當你嘗試添加一個book2.setId(newBookPK(500,600));它是抱怨它已經存在。

嘗試

book2.setId(new BookPK(500, 601)); 

編輯:對於第二個問題

我認爲你可以。在你的書的實體嘗試

@Id 
@Column(name="BOOK_IX") 
private long bookIx; 
+0

非常感謝。我以爲我已經嘗試過了。有效。對不起,這個愚蠢的問題。 – 2014-12-03 06:58:15

+0

感謝您的回覆。我的第二個問題呢? – 2014-12-03 07:05:22