Spring Data JPA - 使用自定义id/主键保存新实体

11

简而言之,我的问题是如何使用Spring Data JPA保存具有预设主键(而不是null)的实体。

为了解释这个问题,考虑一个简单的实体类Customer。请注意,id未设置为自动递增,并且必须是自定义的唯一值。这只是一个小例子。我需要在我的实际表中,id是一个自定义的唯一值,比如用户名。

@Entity
@Table(name = "customer")
public class Customer implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Basic(optional = false)
    @Column(name = "cust_id", nullable = false)
    private Integer custId;

    @Column(name = "first_name", length = 30)
    private String firstName;

    @Column(name = "last_name", length = 30)
    private String lastName;

    //getter, setters 
}

而且,我有一个CustomerRepository

@Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer> {
}

现在,我想插入一个新的客户记录,id为101。预期的方式是:

Customer customer = new Customer();
customer.setCustId(101);
customer.setFirstName("Some");
customer.setLastName("Name");

repository.save(customer);

但是,有时候repository.save()无法插入ID为101的新客户。那么,我该怎么做呢?


它代替了什么?保存了什么到数据库中?你的测试是什么来确保它没有被保存? - robert_difalco
@user1888440 数据库中没有保存任何内容。我手动检查了数据库表以确保这一点。 - Jomoos
1
听起来你的事务没有提交。你是否使用了 @Transactional?确保在事务提交后检查数据库或确保调用 flush。 - robert_difalco
@user1888440 谢谢兄弟!在调用 flush() 后它可以工作了。 - Jomoos
1
没关系,我将评论添加为答案,这样您就可以标记它为已回答。 - robert_difalco
1个回答

8

如果您正在进行活动交易,请记得显式调用 flush 或确保事务已提交,然后再独立检查数据库以确保更改已完成。


5
还有一个方便的saveAndFlush()方法。 - Tomasz Nurkiewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接