使用JPA导入数据保留相同的标识符
问题描述:
我开发了一个简单的Web应用程序,它使用一些数据库表使用JPA。让我们来看表A和表B,并参考表A.我的应用运行在我的客户的不同环境中,如开发,测试和生产阶段。因此,我必须创建一个在这些环境之间导出/导入数据的过程。使用JPA导入数据保留相同的标识符
当我移动对象时,我想保留相同的ID,因为我想保留相同的引用。有没有办法与JPA做到这一点?
我使用Hibernate 4.3.8和Oracle数据库。这是我的实体:
@Entity
@Table
public class Category
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
}
,我试图做到这一点:
Category category = new Category();
category.setId(1L);
category.setName("Test");
EntityManager em = PersistenceManager.getEntityManager();
em.merge(category);
,但它使用的休眠序列生成的ID,而不是使用给定的一个。如果我使用persist
而不是merge
,则会引发异常,因为它是分离的对象。
有没有办法做到这一点?
答
是的,你可以使用定义的序列
你需要它扩展一个类定义自定义ID生成org.hibernate.id.SequenceGenerator
:
package yourPackage;
public class CustomGenerator extends SequenceGenerator
{
@Override
public Serializable generate(SessionImplementor session, Object obj)
{
...
}
}
,并使用您的自定义生成器在实体:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CustomGenerator")
@GenericGenerator(name = "CustomGenerator",
strategy = "yourpackage.CustomGenerator",
parameters = {
@Parameter(name = "sequence", value = "custom_id_sequence")
})
private Long yourId;
+0
嗨马泰奥!感谢您的回答。我只想在导入过程中使用定义的ID。否则,它应该使用序列或默认的生成器策略。所以策略应该像“id == null?generate:this.id”。你同意吗 ? – chupetoide
有人会认为“导入过程”会使用SQL导入脚本,并使用“javax.persistence.XXX”属性导入它 –
嗨,尼尔,它是一个出口和进口的过程。如果我使用SQL导入脚本,我应该在导出端生成它。有没有办法与JPA做到这一点? – chupetoide