提问者:小点点

JPA仓库保存后检索自定义主键值


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

表结构——

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";
    }

共1个答案

匿名用户

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

AUTO-标识列、序列或表,具体取决于基础DB。

如果您看这里,您会注意到所有这些生成类型为longint的id,而不是String类型。

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

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