Search code examples
javahibernatespringormjpa

Bypass GeneratedValue in Hibernate (merge data not in db?)


My problem is the same as described in [1] or [2]. I need to manually set a by default auto-generated value (why? importing old data). As described in [1] using Hibernate's entity = em.merge(entity) will do the trick.

Unfortunately for me it does not. I neither get an error nor any other warning. The entity is just not going to appear in the database. I'm using Spring and Hibernate EntityManager 3.5.3-Final.

Any ideas?


Solution

  • it works on my project with the following code:

    @XmlAttribute
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy=GenerationType.IDENTITY, generator="IdOrGenerated")
    @GenericGenerator(name="IdOrGenerated",
                      strategy="....UseIdOrGenerate"
    )
    @Column(name = "ID", nullable = false)
    private Integer id;
    

    and

    import org.hibernate.id.IdentityGenerator;
    ...
    public class UseIdOrGenerate extends IdentityGenerator {
    private static final Logger log = Logger.getLogger(UseIdOrGenerate.class.getName());
    
    @Override
    public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
        if (obj == null) throw new HibernateException(new NullPointerException()) ;
    
        if ((((EntityWithId) obj).getId()) == null) {
            Serializable id = super.generate(session, obj) ;
            return id;
        } else {
            return ((EntityWithId) obj).getId();
    
        }
    }
    

    where you basically define your own ID generator (based on the Identity strategy), and if the ID is not set, you delegate the generation to the default generator.

    The main drawback is that it bounds you to Hibernate as JPA provider ... but it works perfectly with my MySQL project