JPA持久化后嵌入id自动生成的字段为空

问题描述 投票:0回答:1

我有一个由主类(称为

MaterialResource
)组成的类结构,该主类具有嵌入的 id(称为
MaterialResourceId
)。另请注意,
MaterialResourceId
类有两个字段:
idMaterialResource
idCompany
idMaterialResource
自动生成的,具有策略标识。

问题是,当我持久化一个

MaterialResource
对象(将
idMaterialResource
设置为
null
,因为它应该是自动生成的)时,数据库插入工作正常,但返回的对象将
idMaterialResource
字段设置为也
null
。这样我就无法知道我新创建的对象被分配了什么id(什么数字)。

课程如下。这是主要课程:

@Entity
@Table(name = "material_resource")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class MaterialResource {

    @EmbeddedId
    private MaterialResourceId materialResourceId;

    @Column(name = "name", nullable = false)
    private String name = "";
    ...
}

这是它的嵌入ID:

@Embeddable
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MaterialResourceId implements Serializable {
    private static final long serialVersionUID = 1L;

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_materialresource")
    private Integer idMaterialResource;

    @Column(name = "id_company")
    private Integer idCompany;
}

(请注意,我使用

lombok
注释来生成 getter、setter、equals、hashCode...)

现在,如果我尝试执行:

MaterialResourceId id = new MaterialResourceId(null, 1);
MaterialResource materialResource = MaterialResource(id, "Material resource name", ...);
getEntityManager().persist(materialResource);

(请注意,前面的所有代码都放置在实体管理器事务中)

原来

materialResource.materialResourceId.idMaterialResource
null
。正如我所说,这是一个问题,因为我不知道已分配了哪个 id。因此,我无法将创建的对象的 id 返回给客户端,我无法在数据库中找到该对象...

但是,如果我使用外部应用程序 (DBeaver) 检查数据库,

MaterialResource
表中的一行已正确创建(具有自动生成的
idMaterialResource
值)。

用于创建

MaterialResource
表的 Flyway 脚本如下(这里是我将
id_materialresource
设置为自动生成的位置)。

CREATE TABLE IF NOT EXISTS material_resource(
    id_materialresource INT NOT NULL AUTO_INCREMENT,
    id_company INT NOT NULL,
    name VARCHAR(255) NOT NULL DEFAULT "",
    identifier VARCHAR(255) NOT NULL DEFAULT "",
    fromDate DATE NOT NULL,
    toDate DATE NOT NULL,
    PRIMARY KEY (id_recurso, id_empresa)
);

任何帮助都是有用的。谢谢!

java hibernate jpa persist
1个回答
0
投票

实际上,我已经在这里找到了我的问题的答案。基本上,Hibernate 目前不支持自动生成的组合 id。

© www.soinside.com 2019 - 2024. All rights reserved.