У меня есть класс сущности, указывающий на таблицу 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";
}
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;
Похожие вопросы
Связанные вопросы
Новые вопросы
jpa
Jakarta/Java Persistence API (JPA) — это спецификация Java для доступа, сохранения и управления данными между объектами/классами Java и реляционной базой данных. Это часть спецификации EJB 3.0 и стандартный подход к объектно-реляционному отображению (ORM).