2014-12-03 149 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