我有一个由主类(称为
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)
);
任何帮助都是有用的。谢谢!
实际上,我已经在这里找到了我的问题的答案。基本上,Hibernate 目前不支持自动生成的组合 id。