【问题标题】:Hibernate JPA persistence - How to obtain new entity identifier after insert / save / mergeHibernate JPA持久性-插入/保存/合并后如何获取新的实体标识符
【发布时间】:2014-03-08 20:01:06
【问题描述】:

我对 Hibernate / JPA 持久性非常陌生,我正在尝试通过我为此创建的新对象找到如何获取数据库中插入记录的 ID。

我正在使用 Hibernate 4.0.4,并且正在使用休眠会话 API 而不是 EntityManager。

用户类

@Entity
@Table(name = "users")
public class User implements Serializable {

    private String email;
    private String firstName;
    private int id;
    private String lastName;
    private String password;

    @Column(name = "email", nullable = false, unique = true)
    public String getEmail() {
        return email;
    }

    @Column(name = "firstName", nullable = false)
    public String getFirstName() {
        return firstName;
    }

    @Id
    @Column(name = "id")
    public int getId() {
        return id;
    }

    @Column(name = "lastName")
    public String getLastName() {
        return lastName;
    }

    @Column(name = "password", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setHeroes(List<Hero> heroes) {
        this.heroes = heroes;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

执行代码 - 尝试 1

User user = new User();
user.setEmail((String) arg.get("email"));
user.setFirstName((String) arg.get("firstName"));
user.setLastName((String) arg.get("lastName"));
user.setPassword(Password.getSaltedHash((String) arg.get("password")));
Transaction tx = sessionFactory.getCurrentSession().beginTransaction(); //committed later on...
int id = (Integer) sessionFactory.getCurrentSession().save(user); //This always returns 0 even though inserted rows in database have IDs as expected

执行代码 - 尝试 2

//Same as before for defining user...

Transaction tx = sessionFactory.getCurrentSession().beginTransaction(); //commited later on...
user = (User) sessionFactory.getCurrentSession().merge(user);
int id = user.getId(); //This also always returns 0 even though the rows are being inserted into the database as expected

所以我的问题是:

如何成功地将用户对象持久化到数据库中,并通过该用户对象获取记录的ID?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    有不同类型的 id 列。我想您想获取生成的值,请结合 @Id 查看 @GeneratedValue 注释的不同选项。

    据我所知GenerationType.AUTO 能够在将您的 id 字段存储到数据库后自动更新它。但你可能必须在使用 id-getter 之前调用“flush()”。

    我的最佳做法是尽量不依赖对象的技术 ID。如果您需要它来处理对象之间的关系,那么您绝对应该更喜欢使用@OneToMany 等。

    【讨论】:

    • 非常感谢!我可以确认,通过简单地将注释 @GeneratedValue 添加到 ID getter 现在在我的问题中提到的两次尝试中返回正确的 ID。如此简单,但对我来说似乎很难找到合适的文献。
    • 是的,我同意你的观点,我最好在实体关系之间依赖对象本身,我确实这样做了,但在这种情况下,我需要将 ID 作为 JSON 输出到前面结束。
    猜你喜欢
    • 2018-01-11
    • 2010-12-30
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2012-11-02
    • 2017-10-04
    • 2012-06-17
    相关资源
    最近更新 更多