gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:29:12 25 4
gpt4 key购买 nike

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

我的实体是:

@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(注意,create 调用 em.persist 并 save 调用 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 呢?

最佳答案

看一下 headCatalogFacade.save(headCatalog); - 它具有写入数据库的对象的 returnType。只需编写headCatalog = headCatalogFacade.save(headCatalog);。当你得到它的ID时,它就不再是空的了。您可以实现自己的 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);
}

关于mysql - 使用 eclipselink 持久化和合并实体后无法获取 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37698606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com