0

私は Hibernate と JPAContainer を使用しています。エンティティと予期しない動作部分のコードは次のとおりです。

// MyEntity
@Entity
class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private String value;

    // getters and setters...
}

// set up JPAContainer
JPAContainer c = JPAContainerFactory.make(MyEntity.class, "lazyhibernate");
c.getEntityProvider().setEntityManager(null);
c.getEntityProvider().setEntityManagerProvider(entityManagerProvider);
c.getEntityProvider().setLazyLoadingDelegate(new HibernateLazyLoadingDelegate());

final BeanItem<MyEntity> item = new BeanItem<MyEntity>(new MyEntity());
fill(item); // fill item fields...
MyEntity e = item.getBean();
c.addEntity(e);
c.commit();

System.out.println(e.getId()); // return null

新しく作成されたエンティティのIDを取得するには?

4

1 に答える 1

0

コンテナでコミットを行わない限り、JPAContainer から UUID が ItemID として返されます。それ以外の場合 (コミット後)、データベースから提供された ID を使用して、EntityID (EntityItem) を再度取得します。

UUID uuid = (UUID) c.addEntity(e); 
EntityItem<MyEntity> itemUncommitted = c.getItem(uuid) // here you use the UUID to retrieve the Entity
c.commit();
EntityItem<MyEntity> itemCommited = c.getItem(e.getId()); // here you use the ID of the DB 

しかし、JPAContainer については忘れることをお勧めします。便利だけど問題点が多すぎる。ヘルパー クラス、EJB などを介してサービス レイヤーを作成することをお勧めします。UI コードから JPA 関数を非表示にできます。

于 2016-02-23T09:22:26.617 に答える