【问题标题】:How do I use auto generated id in code with Spring Data?如何在 Spring Data 的代码中使用自动生成的 id?
【发布时间】:2017-05-23 05:53:34
【问题描述】:

创建实体时,它通常会收到一些自动生成的主键 int 值。我有一个名为“属性”的实体,它可以有一个相关的“参数”实体列表。

@Entity
@Table(name = "ATTRIBUTES")
public class Attribute {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "ATTRIBUTE_ID", length = 10, nullable = false)
    private int id;

    @Column(name = "NAME")
    private String name;

    @JsonIgnore
    @LazyCollection(LazyCollectionOption.FALSE)
    @OneToMany(mappedBy = "attribute", cascade = CascadeType.ALL)
    private List<Parameter> parameters;

接下来我有一个名为“参数”的实体,它需要与“属性”链接。所以当我创建一个“参数”时,我需要指定它的“属性”。 我怎么做?有什么诀窍?

@Entity
@Table(name = "PARAMS")
public class Parameter {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "PARAMETER_ID", length = 10, nullable = false)
    private int id;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "ATTRIBUTE_ID", referencedColumnName = "ATTRIBUTE_ID")
    private Attribute attribute;

    @Column(name = "VALUE")
    private String value;

【问题讨论】:

  • Parameter 实体中使用@ManyToOne(optional = false)。在这种情况下,attribute 不能为空。

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


【解决方案1】:

您的问题不清楚,但我想您是在问如何在手头没有 Attribute 实例的情况下创建 Parameter 实例?您必须有一个 ATTRIBUTE_ID,因为它可能不为空,并且您可以通过多种方式进行操作。假设您已经有一个 Attribute 实例,您可以将它的主键显式添加为 Parameter 的属性,例如

@Column(nullable=false, name="ATTRIBUTE_ID")
private Integer attributeId;

当然还要创建 getter/setter 并明确设置 id。如果您有 Attribute 的实例,还有其他策略,您可以在 Attribute 中添加 Parameter 并使用级联持久化。

【讨论】:

  • 不完全是。例如,我需要向已经存在的“属性”添加一个“参数”。我可以通过 findById 方法在 JPA 存储库的帮助下获取该“属性”,但是我如何知道要查找的 id?
  • 很抱歉,我在理解您的问题时遇到了一些问题。如果您有一个现有的属性,那么您也有一个 ID(您在 findById 中使用的那个?),并且您在属性上也有一个 getter,或者您应该按照我在之前的回答中提到的类似方式创建一个。我想我并没有真正回答你的问题,因为我还不清楚。
  • 好吧,我真的迷路了,所以我可能听起来很随意。但是让我们想象一个情况。表“属性”暂时不存在。我启动我的应用程序,表自动创建,一些属性(假设它的名称为“详细信息”)也由一些初始化脚本创建。我需要将此属性添加到我的对象中,然后再指定参数,但我怎么知道这个属性会有什么 id?
  • 你属性的id是由序列决定的,是技术信息。如果由数据库脚本创建,您不知道 id。您必须通过另一个参数搜索属性,例如名称 = '详细信息'。如果您在事务下在 Java 中创建实体,那么您将在持久化它时生成 id,并且可以使用相应的 getter 来查看它。要查询,您可能会使用 EntityManager 或 Spring Data Repository。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 2017-11-23
  • 2016-07-23
  • 2017-04-25
  • 2018-04-27
  • 2014-04-25
  • 2016-02-06
  • 1970-01-01
相关资源
最近更新 更多