我有一个由主类(称为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;
}
(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.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)
);
任何帮助都是有用的。谢谢你,谢谢
1条答案
按热度按时间n53p2ov01#
其实,我已经找到了我的问题here的答案。基本上,Hibernate目前不支持自动生成的组合ID。