У меня есть класс сущности, указывающий на таблицу 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";
    }
0
vinayg 17 Ноя 2019 в 09:22

1 ответ

Если вы не укажете стратегию генерации идентификатора, Hibernate будет использовать GenerationType.AUTO. Это приведет к любому из

АВТО - столбец идентичности, последовательность или таблица в зависимости от базовой БД.

Если вы посмотрите здесь, вы обратите внимание, что все эти генерирующие идентификаторы имеют тип long, short или int, а не тип String.

Допустим, вам нужен UUID String в качестве идентификатора, вы можете использовать

@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "paymentreferencenumber")
private String refNum;
0
Kunal Vohra 18 Ноя 2019 в 15:25