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

Spring boot JPA-数据库中实体的主键

景德海
2023-03-14

我有父实体和子实体之间的@OneTo众多@ManyToOne关系。

@Entity
@Table(name = "parent")
public class Parent {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;


@OneToMany(targetEntity=Measurement.class, mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
@JsonManagedReference
private List<Child> children = new ArrayList<>();
}

我有这样的孩子

@Entity
@Table(name = "child")
public class Child {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@ManyToOne(targetEntity=Parent.class, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
@JsonBackReference
private Parent parent;

保存此数据后,数据库看起来如下所示,

Parent:
 id
 1

 Child
 id     parent_id
 2      1

我的问题是,为什么child的主键是2而不是1?在子表中,主键可以是1,外键对父表的引用可以是1。当我再添加一个父项时,表如下所示,

Parent:
 id
 1
 3

 Child
 id     parent_id
 2      1
 4      3    

是我做错了什么,还是这是我预期的行为?

共有1个答案

景高杰
2023-03-14

生成策略@GeneratedValue(策略=GenerationType. AUTO)将从默认的Hibernate序列中获取值,因此相同的序列用于所有键生成。

当您插入数据时,它会以先父后子的顺序插入数据,因为它从同一序列生成器中获取值,所以它会按顺序增加所有表的值。

您需要使用GenerationType。身份符合您的目的的策略。

在父母中

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

在儿童时期

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
 类似资料:
  • 我正试图让我的头绕过DDD,但我卡住了。这就是我如何设置我的项目: 然后,我继续实现UserRepository,这里我遇到了另一个问题:UserRepository接口需要域用户模型,当我试图在DAL中实现接口时,我需要使用域用户模型来实现它,这导致DAO是为域模型而不是DAL模型创建的,这没有任何意义。唯一能修正的就是在域层中引用DAL,这是错误的。 有人能解释一下我在DDD中遗漏了什么吗?

  • 因为我是个新手,我的问题可能很简单。我搜索了一下,但没有找到一个令人信服的答案。在开发REST API时,API的目的是从现有的学生中创建一个玩家团队。POST方法,从现在开始,请求正文将保存请求正文中的学生ID(主键)。 在访问REST API时,请求主体是否可以包含表主键?

  • 问题内容: 我正在尝试从现有的空数据库中生成symfony2中的实体(相当大,从头开始创建实体确实很痛苦)。不幸的是,我遇到了很大的问题。 当我尝试调用以下命令时(在Windows上如果发生任何更改): 我收到以下消息: 没有要处理的元数据类。 发布之前,我已经: 验证我的配置正常(我可以连接到数据库), 我的捆绑软件已创建,上面指定的路径有效 当我尝试转换为xml / yml时,与尝试生成注释映

  • 我是Hibernate的新手,并要求使用具有这些列的表的数据库 表:TBL _ product//库存项目列表< br >列:< br > key _ product < br > key _ category < br > fld _ product _ name < br > fld _ Inventory _ qty < br > fld _ unit _ price < br > fld

  • 问题内容: 在Spring MVC中使用PropertyEditor时,让它们从数据库中获取实体是否不好?我应该改为创建一个空实体并设置其ID。 例如,实体Employee: 使用以下GenericEntityEditor在下面的PropertyEditor中获取Entity是一个坏主意: 可以绑定在控制器中: 是否更喜欢对EmployeeEditor使用更具体的方法,并使其仅实例化Employe

  • 我有生成Hibernate实体的mysql db,现在我需要从这些实体生成内存数据库进行测试。我在试图运行我的单元测试时遇到了这个错误。 /***主]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:42102,SQLState:42S02 2016-02-16 18:10:47.864错误29758---[main]o.h.engine。jdbc。spi。Sql