使用eclipselink持久化并合并实体后无法获取ID

j

我在Centos 7下的Netbeans 8.1中使用带有MySQL的Glassfish 4.1.1和EclipseLink 2.5.2。

我的实体是:

@Entity
@Table(name = "headCatalog")
@XmlRootElement
public class HeadCatalog implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator = "headCatalog")
@TableGenerator(name = "headCatalog", table = "sequenceNumbers",
        pkColumnName = "tableName", valueColumnName = "sequenceNumber",
        pkColumnValue = "headCatalog")
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "brand")
private String brand;
@Size(max = 45)
@Column(name = "model")
private String model;
@Basic(optional = false)
@NotNull
@Column(name = "arc")
private double arc;
....

我正在尝试使用以下方法将数据加载到其中:

headCatalog = new HeadCatalog();
headCatalogFacade.create(headCatalog);
headCatalog.setBrand(brand);
headCatalog.setModel(model);
headCatalog.setArc(arc);
headCatalogFacade.save(headCatalog);
headCatalogFacade.flush();
//headCatalogFacade.refresh(headCatalog);
headCatalogID = headCatalog.getId();
....

运行此命令时,headCatalogID返回null(请注意,创建调用em.persist并保存调用em.merge;这是netbeans生成的样板代码)。我设置了一个断点,刷新后,ID值在数据库中。如果取消对刷新的注释,则会收到一条消息,指出headCatalog已分离。

我正在使用@TableGenerator作为解决方法;如果我用

@GeneratedValue (GenerationType.SEQUENCE or strategy = GenerationType.IDENTITY) 

我得到:

Severe:   com.wjrust.sprinklere.entities.HeadCatalog.id may not be null

如果我执行查询并重新加载实体,则ID在那里,但是由于我不知道ID是什么,因此创建查询是一个问题。

那么,保存实体后如何获得ID?

XiCoN JFS

看一下headCatalogFacade.save(headCatalog);-它具有写入数据库的对象的returnType。只是写headCatalog = headCatalogFacade.save(headCatalog);当您获取ID时,它将不再为null。您可以实现自己的save()方法来更改该行为。

如果您的IDE自动生成了该方法,请仔细查看其调用的方法。em.merge(Object object)具有您作为参数传递的对象的returnType。

我一直喜欢对EJB实施基本方法,如下所示:

public <T> T save(T o) {
    if (o == null) throw new EntityNotFoundException("Dao::save does not allow null values.");
    return em.merge(o);
}

public void remove(Object o) {
    if (o == null) throw new EntityNotFoundException("Dao::remove does not allow null values.");

    em.remove(em.merge(o));
}

public <T> T find(Class<T> clazz, Object id) {
    return em.find(clazz, id);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

持久化实体时出现 EclipseLink 错误 (id null)

来自分类Dev

使用级联持久化实体时获取子代ID

来自分类Dev

合并后获取实体JPA ID?

来自分类Dev

使用EclipseLink不能持久保存实体

来自分类Dev

持久化后如何填充整个实体?

来自分类Dev

使用libgit2拉(获取并合并)

来自分类Dev

无法在Glassfish上使用EclipseLink保留任何JPA实体

来自分类Dev

实体会话bean-将数据持久化到表中并使用创建的ID持久化另一个表

来自分类Dev

使用合并合并先前的值

来自分类Dev

如何使用Mockito和jUnit模拟持久化和实体

来自分类Dev

从 postgresql 表中获取并合并数据

来自分类Dev

获取最新的持久化ID并将其返回

来自分类Dev

持久化一个已关联使用@idclass的实体列表的实体

来自分类Dev

在实体中使用嵌入式类时传递的分离实体可以持久化

来自分类Dev

使用分支SVN创建标签并合并

来自分类Dev

每个持久化后使用getManager效率更高吗?

来自分类Dev

使用实体框架按ID获取记录

来自分类Dev

删除并合并多个分区后如何恢复文件?

来自分类Dev

删除并合并SSD上的分区后恢复文件

来自分类Dev

Symfony,Doctrine,合并无法正常工作(虽然同一实体的持久性确实存在)

来自分类Dev

休眠:分离的实体传递给持久化

来自分类Dev

持久实体不会反序列化

来自分类Dev

持久化对象时分离的实体异常

来自分类Dev

休眠:分离的实体传递给持久化

来自分类Dev

Hibernate 分离实体传递到持久化

来自分类Dev

使用Hibernate在Postgres中使用@EmbeddedId和@ElementCollection持久化实体的问题

来自分类Dev

从两个API中获取并合并

来自分类Dev

获取两列的不同值并合并成行

来自分类Dev

从下一行获取值并合并-awk

Related 相关文章

热门标签

归档