如何在JPAContainer提交后获取实体ID?

时间:2016-02-17 11:55:17

标签: java jpa vaadin jpacontainer

我使用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?

1 个答案:

答案 0 :(得分: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-Functions。