首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体实例化后立即检索实体对象的id?

实体实例化后立即检索实体对象的id?
EN

Stack Overflow用户
提问于 2015-06-18 16:58:24
回答 2查看 179关注 0票数 0

在JPA中是否有一种方法可以在实体实例化后立即检索实体对象的id?例如Person person = new Person();

目前,我在实体类中使用以下策略:@GeneratedValue(strategy = GenerationType.IDENTITY)

如果不是,在数据库中的表设置实际的主键之前,是否有一个“虚拟Id”策略来设置一个dummyId,例如-10等?请注意,MySQL DB中的主键被设置为AutoIncrement。

我需要这样做的原因是能够在列表中添加新的实体,并在将它们保存到DB之前使用JSF数据表中的id对它们进行排序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-18 21:15:13

在持久化之前,无法检索ID --仅仅是因为在持久化实体之前它没有ID。这和你的策略无关。这与赞同有关。

但是,您可以为用例添加自己的临时密钥:

代码语言:javascript
复制
@Entity
public class Person {
    private static final AtomicLong counter = new AtomicLong();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private final transient long tempId = counter.decrementAndGet();

    public long getIdForComparison() {
        return id == null ? tempId : id;
    }

}

记住,对于每个创建的对象,即使是那些由JPA提供程序实例化的对象,counter也会减少。如果您只想计算新的(未持久化的)对象,或者担心原子计数器的时间,您应该为JPA使用不同的构造函数:

代码语言:javascript
复制
@Entity
public class Person {
    private static final AtomicLong counter = new AtomicLong();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private transient long tempId;

    private String name;

    protected Person() {
        // Constructor for JPA - nothing to do, the id will get attached
    }

    public Person(String name) {
        // Constructor for creation of new objects
        tempId = counter.decrementAndGet();
        this.name = name;
    }

    public long getIdForComparison() {
        return id == null ? tempId : id;
    }

}
票数 0
EN

Stack Overflow用户

发布于 2015-06-18 21:21:39

如果不立即将其保存在DB中,就无法做到这一点,但这显然不是您想要的。如果一次只有一个“新”的人,你可以手动设置“虚拟id”。

代码语言:javascript
复制
person.setId(0L);

别忘了在坚持之前把它清除掉。

代码语言:javascript
复制
person.setId(null);
// ...
em.persist(person);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30921428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档