2016-11-15 9 views
0

私の質問に動作していない理由:@OneToManyアノテーションが

私はINVENTORYテーブルでSTORE_IDとBOOK_IDを保存したいが、なぜInventoryテーブルでSTORE_ID店?私はJPAで新しくなったので、INVENTORYテーブルにSTORE_IDストアのために何をするか教えてください。

1.Book

@Entity 
@Table(name="book") 
public class Book implements Serializable { 
    @Id 
    @Column(name="book_id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
    private String isbn; 
    private String title; 
    private Date publishedOn; 
    private Double price; 
    private int version = -1; 

    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="book") 
    Inventory inventoryRecords = new Inventory(); 

2.Inventory

@Entity 
@Table(name="inventory") 
public class Inventory implements Serializable { 
    /** 
    * 
    */ 
    @Id 
    @Column(name="INVENTORY_ID") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    @OneToOne 
    @JoinColumn(name="book_id") 
    private Book book; 

    @OneToMany(cascade=CascadeType.ALL) 
    @JoinColumn(name="STORE_ID") 
    private Set<Store> stores = new HashSet<Store>(); 

    private Integer quantity; 

3.Store

@Entity 
@Table(name="store") 
public class Store implements Serializable { 
    @Id 
    @Column(name="STORE_ID")  
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
    @Column(name="NickName") 
    private String nickName; 

4.Inメイン

Book b = new Book(); 
     b.setTitle("abc"); 
     b.setIsbn("abc"); 

    Inventory i = new Inventory();  
     i.setBook(b); 
     b.setInventoryRecords(i); 

    Store s = new Store(); 

     s.setNickName("yyynn6"); 
     i.getStores().add(s); 
     entitymanager.persist(b); 

    OUTPUT= 
    Hibernate: insert into book (isbn, price, publishedOn, title, version) values (?, ?, ?, ?, ?) 
    Hibernate: insert into inventory (book_id, quantity) values (?, ?) 
    Hibernate: insert into store (NickName) values (?) 

答えて

0

私はあなたがDBのレベルでそれを台無しだと思います。店はそれで多くの本を持っている場合は、私は、インベントリエンティティを取り除くとどうなる本:本に

@OneToMany(mappedBy="store", cascade=CascadeType.ALL) 
private Set<Book> books= new HashSet<Book>(); 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "STORE_ID") 
private Store store; 

は、あなたが本当にInventoryテーブルが必要ですStoreで

+0

あなたの提案に感謝しますが、あなたの提案が私のケースでは機能していない、私は3つのクラスの本、在庫と店を持っています。私はBookのみを永続化し、Book_IDとStore_IDを持つそれぞれのテーブル+インベントリテーブルですべてのデータを保存したいと考えています。 @manyToOneをマップしたStore Classで試してみましたが、うまくいきませんでした。 – prashant

0

関係に間違った列を選択しました。ストアで

@ManyToOne 
@JoinColumn(name="INVENTORY_ID") 
private Inventory inventory; 

あなたはまた、私は店の内部INVENTORY_ID列を提供することを好む、他の側の逆関係を指定していない、列に参加するStoreエンティティのIdを注釈付きそして、インベントリに:

@OneToMany(mappedBy="inventory",cascade=CascadeType.ALL) 
@JoinColumn(name="INVENTORY_ID") 
private Set<Store> inventories=new HashSet<Store>(); 
+0

あなたの提案に感謝しますが、私の場合はあなたの提案はうまくいきません。私はBookのみを永続化し、Book_IDとStore_IDを持つそれぞれのテーブル+インベントリテーブルですべてのデータを保存したいと考えています。ストアドクラスで@manyToOneをmappedBy =ストアで試してみましたが、動作しません。 – prashant

+0

あなたは歓迎しますが、あなたが尋ねたように@なぜ@OneToManyアノテーションが機能していないのですか?_そのため、私は1対多の部分だけを説明しました。もちろん、Bookと'Inventory'エンティティとその本をInventory内に持ち込みます – jfun

0

のPrashant uはウルクエリが正しく発生しませんと、データがインベントリに入れていないThatsなぜ間違ったマッピングを行っているTable.Soウルマッピングを修正してください。