【问题标题】:Is it possible to create 2 children in a joined inheritance with Spring jpa?是否可以使用 Spring jpa 在联合继承中创建 2 个孩子?
【发布时间】:2021-07-25 05:55:49
【问题描述】:

我正在尝试创建几个与同一个父级链接的子级。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "USER")
public class User implements Serializable {

    @Id
    @Column(name = "ID_USER")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long idUser;

    @Column
    private String email;


@Entity
@Table(name = "PRODUCT_OWNER")
@PrimaryKeyJoinColumn(name = "ID_PRODUCT_OWNER")
public class ProductOwner extends User{

}


@Entity
@Table(name = "SCRUM_MASTER")
@PrimaryKeyJoinColumn(name = "ID_SCRUM_MASTER")
public class ScrumMaster extends User{

    
}

@Entity
@PrimaryKeyJoinColumn(name = "ID_DEVELOPER")
@Table(name = "DEVELOPER")
public class Developer extends User{
            
}

如何创建具有相同用户 ID 的开发人员和 ScrumMaster?

dev = new Developer();
devRegistro.setIdMiembro(new Long("1"));
devRegistro.setEmail("user@email.com");

po = new ProducOwner();
po.setIdMiembro(new Long("1"));
po.setEmail("user@email.com");

developerService.saveOrUpdate(dev);
productOwnerService.saveOrUpdate(po);

失败是因为在第二个事务中已经存在 ID=1 的用户。

我在互联网上看到的所有示例都不能是两个孩子的一部分,例如动物(猫或狗)、车辆(汽车或摩托车)。

【问题讨论】:

  • 显然不能。如果你打电话给em.find(User.class, 1L),你希望得到什么?

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


【解决方案1】:

对您的问题的简短回答:使用您当前的类层次结构,不可能同时保存两种类型的子级,这就是您得到异常的原因。

因此,使用类层次结构阅读您的代码,这些是您传递的信息:

  • ProductOwner 是用户
  • ScrumMaster 是用户
  • 开发者是用户

然后,考虑联合继承策略在 JPA 中的工作方式是每个类有一个表,其中只有子类的列、相同的主键(有时还有鉴别器列和值)。这意味着每个 saveOrUpdate 将在实体类型的类层次结构中的每个表中创建一条记录,每个表都具有相同的主键。所以developerService.saveOrUpdate(dev); 将触发在 User 表中的插入和在 Developer 表中的插入。然后productOwnerService.saveOrUpdate(po); 尝试使用已经存在的主键在 User 表中进行插入,从而违反了数据库的唯一性约束并导致 JPA 异常。

这看起来有点类似于diamond problem...也许重新设计你的类以支持组合而不是继承:用户有 DeveloperAttributes,用户有 ProductOwnerAttributes,用户有 ScrumMasterAttributes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多