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

tyu7yeag  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(95)

我有一个由主类(称为MaterialResource)组成的类结构,它有一个嵌入的id(称为MaterialResourceId)。还要注意MaterialResourceId类有两个字段:idMaterialResourceidCompanyidMaterialResource自动生成的,带有策略标识。
问题是,当我持久化一个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;
}

(Note我正在使用lombok注解来生成getter、setter、equals、hashCode.)
现在,如果我尝试执行:

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

(Note所有前面的代码都放在实体管理器事务中)
结果是materialResource.materialResourceId.idMaterialResourcenull。正如我所说,这是一个问题,因为我不知道哪个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)
);

任何帮助都是有用的。谢谢你,谢谢

n53p2ov0

n53p2ov01#

其实,我已经找到了我的问题here的答案。基本上,Hibernate目前不支持自动生成的组合ID。

相关问题