【问题标题】:JPA repository retrieve custom primary key value after saveJPA 存储库在保存后检索自定义主键值
【发布时间】:2019-11-17 06:22:37
【问题描述】:

我有一个指向 postgresql 表的实体类。下面是表结构。 paymentreferencenumber 是由触发器填充的 PK。 id 字段是序列生成的字段。当我尝试使用 JPARepository 保存方法在此表中保存时,它会插入第一条记录。但之后由于主键约束而失败。由于 PK 是字符串类型并使用触发器生成,因此我将生成器策略指定为“选择”。任何人都可以帮助我使用这个阻止程序并为我指明正确的方向。谢谢

表结构--

custId serial not null,
    paymentreferencenumber varchar(32) not null
        constraint customers1_pkey
            primary key,
    firstname varchar(255),
    lastname varchar(255)

Entity class --
@Entity
@Table(name = "customersnew")
public class Customer implements Serializable {

    private static final long serialVersionUID = -1L;


    @GeneratedValue(generator = "seq")
    @GenericGenerator(name="seq", strategy="sequence", parameters = { @Parameter(name="key", value = "customersnew_custid_seq")})
    @Column(name = "custid")
    private long id;

    @Id
    @GeneratedValue(generator = "trigger_generated")
    @GenericGenerator(name="trigger_generated", strategy="select", parameters = { @Parameter(name="key", value = "id")})
    @Column(name = "paymentreferencenumber")
    private String refNum;

    @Column(name = "firstname")
    private String firstName;

    @Column(name = "lastname")
    private String lastName;

}

--- Controller using JPA save

@RestController
public class CustomerController {

    @Autowired
    CustomerRepository repository;

    EntityManagerFactory emf;

    public CustomerController(CustomerRepository repository, EntityManagerFactory emf) {
        this.repository = repository;
        this.emf = emf;
    }

    @PostMapping("/create")
    public String create(@RequestBody CustomerUI customer){
        // save a single Customer

        Customer returnObj = repository.saveAndFlush(new Customer(customer.getFirstName(), customer.getLastName()));

        PersistenceUnitUtil util = emf.getPersistenceUnitUtil();

        Object retObj = util.getIdentifier(returnObj);

        return "Customer is created";
    }

【问题讨论】:

    标签: jpa spring-data-jpa


    【解决方案1】:

    如果不指定 id 生成策略,Hibernate 将使用GenerationType.AUTO。这将导致任何

    AUTO - 标识列、序列或表,具体取决于 底层数据库。

    如果您查看here,您会注意到所有这些都生成longshortint 类型的ID,而不是String 类型。

    假设你想要一个 String UUID 作为 id,你可以使用

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "paymentreferencenumber")
    private String refNum;
    

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 2018-10-06
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多