2017-01-02 11 views
1

私はspring-dta-jpaアプリケーションを持っています。いくつかのJUnitテストを実行する前に、埋め込まれたH2データベースを作成します。これはSpringのdocに記述されているように、私のmavenプロジェクトのresourceフォルダにdata.sqlファイルを置くことで可能になることがわかっています。data.sqlの初期化でspring-data-jpaの1対多の関係を初期化する方法

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html

私の質問は:どのように私はそのdata.sqlにファイル内の関係(「1対多」)親の子を初期化しますか?子エンティティを挿入するときに親のIDを知らない。

答えて

0

あなたはID(およびないUUID)としてロングを使用している場合は、より多くの可能性の高い記録があなたのdata.sqlにしてエンティティ関係の

例として登場して、あなたのIDは1から始まり、同じ順序に一致します

@Entity 
public class Document { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false, length=256) 
    @Size(min=1,max=256) 
    private String name; 

    private String code; 

    private Date date; 

    @OneToMany(mappedBy = "document", cascade = CascadeType.ALL) 
    @JsonManagedReference 
    private List<DocumentItem> documentItems; 


@Entity(name="document_item") 
public class DocumentItem { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false, length=256) 
    private String name; 
    private BigDecimal price; 

    @ManyToOne(optional = false) 
    @JsonBackReference 
    private Document document; 

上記の例では、document_id列にdocument_idというエンティティが追加されています。

あなたはまた、例えば、関係のために使用されているJoinColumnアノテーションで列名を指定することがあります。

@ManyToOne(optional = false) 
@JoinColumn(name = "publisher_id") 
private Publisher publisher; 

例の初期化スクリプト:

INSERT INTO document(name, code) VALUES ('Test Document 1', 'TD-1'); 
INSERT INTO document(name, code) VALUES ('Test Document 2', 'TD-2'); 
INSERT INTO document(name, code) VALUES ('Test Document 3', 'TD-3'); 
INSERT INTO document(name, code) VALUES ('Test Document 4', 'TD-4'); 
INSERT INTO document(name, code) VALUES ('Test Document 5', 'TD-5'); 

INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.A', 100.45); 
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.B', 30.45); 
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.C', 564); 
INSERT INTO document_item(document_id, name, price) VALUES (4,'Test Item 4.A', 1); 
INSERT INTO document_item(document_id, name, price) VALUES (4,'Test Item 4.B', 456); 
INSERT INTO document_item(document_id, name, price) VALUES (5,'Test Item 5.A', 67); 
INSERT INTO document_item(document_id, name, price) VALUES (2,'Test Item 2.D', 98); 
+0

あなたは可能性が高いあなたのIDから開始する」書きます1 "...それは"ただの可能性のある洞察 "ではない(私が知ったところでは)IDはDBによってどのように生成されるのかを構成することができます。 @GeneratedValue((strategy = GenerationType.AUTO)または@GeneratedValue(strategy = GenerationType.SEQUENCE) @ SequenceGenerator(name = "sequence"、allocationSize = 10)後者はシーケンシャルな番号付けをします。 – Robert

+0

@Robert、あなたは正しいです。私はちょうどID生成戦略について詳しくは詳しくは触れていませんでしたが、その可能性を示唆しています。 – Alexander

関連する問題