[英]Hibernate not set foreign key
我有這個 model
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToOne
@PrimaryKeyJoinColumn
private Address registred_address_id;
@OneToOne
@PrimaryKeyJoinColumn
private Address actual_address_id;
...
我有這個方法
private Customer addCustomer(String first_name, String last_name, String middle_name, String sex, Address address) {
Customer customer = new Customer(first_name, last_name, middle_name, sex);
customer.setActual_address_id(address);
customer.setRegistered_address_id(address);
customerRepo.save(customer);
return customer;
}
但是 hibernate 沒有設置actual_address_id和registered_address_id(它是OneToOne)
Hibernate:插入客戶(名字,姓氏,中間名,性別)值(?,?,?,?)2021-03-18 14:01:58.340 WARN 12836 --- [nio-8080-exec-1] ohengine。 jdbc.spi.SqlExceptionHelper: SQL Error: 0, SQLState: 23502 2021-03-18 14:01:58.340 ERROR 12836 --- [nio-8080-exec-1] ohengine.jdbc.spi.SqlExceptionHelper: ОШИБКА: значение NULL в столбце "registred_address_id" отношения "customer" нарушает ограничение NOT NULL Подробности: Ошибочная строка содержит (6, null, null, null, null, null, male).
你的映射是矛盾的。
從一方面來說,您希望Customer.id
在插入后由數據庫生成。 這就是GenerationType.IDENTITY
的實際含義。
從另一面,您嘗試使用@PrimaryKeyJoinColumn
意味着Customer.id
應該由Address.id
設置。 @PrimaryKeyJoinColumn
的正確映射應如下所示:
@Entity
public class Customer {
@Id
private long id;
@OneToOne
@PrimaryKeyJoinColumn
private Address address;
public void setAddress(Address address) {
this.address = address;
this.id = address.getId();
}
// ...
}
但這不符合您的要求。
因此,我建議您像這樣更正您的客戶表:
create table customer
(
id bigserial not null,
reg_address_id bigint,
act_address_id bigint,
-- ...
primary key(id),
foreign key(reg_address_id) references address(id),
foreign key(act_address_id) references address(id)
);
然后使用以下映射:
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "reg_address_id")
private Address registredAddress;
@OneToOne
@JoinColumn(name = "act_address_id")
private Address actualAddress;
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.