0

私はエンティティを持っています

@Entity
public class Book {

    @Id
    @Column(name = "book_id")
    @SequenceGenerator(name = "book_book_id_seq", sequenceName = "book_book_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "book_book_id_seq")
    private Long id;

    // getter, setter & other fields
}

スキーマ付き

CREATE TABLE book
(
  book_id bigint NOT NULL DEFAULT nextval('book_book_id_seq'::regclass),
  CONSTRAINT book_pkey PRIMARY KEY (book_id)
)

私が達成したいのは、データベースによって生成されたシーケンス/ ID を使用したい場合もありますが、データが別の場所で作成され、既存の (手動) ID で作成したい場合もあります。

CrudRepositorySpring Data JPA の方法 ( を使用) または JPA の方法 ( を使用)で id を手動で設定することはできませんがEntityManager、ネイティブ クエリでは問題ありません。これはJPAの制限ですか?私の問題の回避策はありますか?

Book book01 = new Book();
bookRepo.save(book01); // Book with id 1 is created

Book book02 = new Book();
book02.setId(5555L);

bookRepo.save(book02); // Does not create book with id 5555, but 2

Query nativeQuery = entityManager.createNativeQuery("INSERT INTO book VALUES (6666);");
nativeQuery.executeUpdate(); // Book with id 6666 is created

Query nativeQuery02 = entityManager.createNativeQuery("INSERT INTO book DEFAULT VALUES;");
nativeQuery02.executeUpdate(); // Book with id 3 is created

PostgreSQL 9.4、Hibernate 5、および Java 8 を使用しています。

4

2 に答える 2

1

永続化時に、フィールドに @GeneratedValue のアノテーションが付けられている場合、指定された戦略で ID が生成されます。次に、生成された値で id フィールドの値を設定します。そのため、永続化する前に setId() を使用して ID を手動で設定した場合、これは上書きされます。

必要に応じて、自動生成 ID に em.persist を使用できます。次に、ネイティブ SQL を使用して ID を手動で設定します。これは、ネイティブ SQL がエンティティに対するマッピングをバイパスするためです。

于 2015-10-12T11:51:26.797 に答える
0

はい、デフォルトで Hibernateorg.hibernate.id.SequenceGeneratorは常に新しい ID を生成します。あなたがすべきことはpublic Serializable generate(SessionImplementor session, Object obj)メソッドをオーバーライドすることです。あなたのobj(エンティティへの最初のキャスト)がIDを持っている場合はIDを返し、そうでなければデータベースシーケンスから取得します。

于 2015-10-27T04:20:58.767 に答える