我在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?
看一下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] 删除。
我来说两句