【问题标题】:hibernate inheritance save child after parent休眠继承在父母之后保存孩子
【发布时间】:2021-06-27 08:09:46
【问题描述】:

我以这种方式在我的实体结构中使用 Joined Hibernate Inheritance Mapping

@Getter
@Setter
@Entity
@Table(name= "app_user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    //some other fields
}



@Getter
@Setter
@Entity
@Table(name= "app_customer")
public class Customer extends User {
    //some other fields
}

我想先保存一个用户,然后在另一个 api 中保存一个客户,然后将该客户映射到第一个用户。所以我尝试以这种方式保存具有现有用户 ID 的新客户:

User user = ... //find already saved user
Customer customer = new Customer();
customer.setId(user.getId());
...
customerRepository.save()

但是,hibernate 使用新生成的 id(而不是固定的传递 id)生成客户 ,并且还会生成一个新用户。这是我的问题:如何在其父级之后保存一个子级?有没有在不再次保存父母的情况下保存孩子?

【问题讨论】:

  • 不要使用继承。数据库不支持继承。也许为客户添加一个字段 user_id。
  • @yuri777 问题与数据库无关。我们不需要在 db 层继承。
  • 当然问题不在数据库中。您在数据库中创建了 2 个表:app_user 和 app_customer。并且数据库不包含有关继承的信息。它只是具有相同字段(或几乎相同)的 2 个表。当您创建并保存新用户时,您会将新记录添加到表 app_user。当您创建并保存新客户时,您会在表 app_customer 中创建新记录。并且这些记录有不同的 ID 自动生成。

标签: java hibernate jpa inheritance spring-data-jpa


【解决方案1】:

尝试更改第二个实体:

@Getter
@Setter
@Entity
@Table(name= "app_customer")
public class Customer{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    User user;

    //some other fields
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多