簡體   English   中英

Hibernate 未設置外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM