使用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,则会引发异常,因为它是分离的对象。

有没有办法做到这一点?

+0

有人会认为“导入过程”会使用SQL导入脚本,并使用“javax.persistence.XXX”属性导入它 –

+0

嗨,尼尔,它是一个出口和进口的过程。如果我使用SQL导入脚本,我应该在导出端生成它。有没有办法与JPA做到这一点? – chupetoide

是的,你可以使用定义的序列

你需要它扩展一个类定义自定义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