当前位置: 首页 > 知识库问答 >
问题:

Hibernate未设置外键

酆茂才
2023-03-14

我有这个型号

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没有设置实际地址id和注册地址id(它是OneTONE)

Hibernate:插入客户(名字、姓氏、中间名、性别)值(?、、?、?)2021-03-18 14:01:58.340警告12836---[nio-8080-exec-1]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2021-03-18 14:01:58.340错误12836---[nio-8080-exec-1]o.h.engine。jdbc。spi。SqlExceptionHelper:ББББА:空值:注册地址id:客户非空值(6,空值,空值,空值,空值,男性)。

共有1个答案

苏品
2023-03-14

你的映射是矛盾的。

从一个侧面看,您需要客户。插入后由数据库生成的id。这就是GenerationType。身份实际上意味着什么。

另一方面,您尝试使用@PrimaryKeyJoinColumn什么是客户。id应通过地址设置。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;

  // ... 
}

 类似资料:
  • 我有一个@OneToOne关系映射。我可以获取记录并查看关系,但我无法创建记录并保留外键。目前,当在父表(FacilityGeneral)中创建新记录时,我也会在子表(FacilityLocation)中创建新记录,但是,子表中的外键不会自动创建。 我试图通过编程将创建为父表(FacilityGeneral)中主键的序列值分配给子表中的不同字段来持久化它,但由于序列#在对象持久化之前不会生成,因此

  • 如果我继续尝试持久化这个实体,我将得到中持久化。 做这件事的正确方法是什么。可能是我理解的不对。

  • 父级 子 在数据库子表中有一列ParentId->典型的一个(父)->多个(子)关系 现在我创建了两个实体 null 我总是需要同时创建密钥OneToMany和ManyToOne的两个部分吗?还是我可以只创建ManyToOne,而不关心我有孩子的父对象? 什么会导致Hibernate给我一条消息,即没有子级的父级违反外键约束?

  • 我将设置为,并将其添加到我的。当我运行和echo,它们都给了我正确的信息。但是,当我运行libgdx安装程序时,它会给出以下错误:<code>错误:未设置JAVA_HOME,并且在路径中找不到任何“JAVA”命令。 请在您的环境中设置JAVA_HOME变量,以匹配您的JAVA安装位置。 有什么想法吗?

  • 我得到这个例外: Java方法 public void getAllRevisions() {

  • 严重:不成功:创建表user_account(user_id bigint not null auto_increment,active bit,address_1 varchar(255),address_2 varchar(255),email varchar(255),first_name varchar(255),last_name varchar(255),phone_contact_1