2015-10-13 14 views
10

Sono nuovo di ibernazione. Quello che sto cercando di fare è usare @CollectionId per generare un identificatore per la mia classe Address. Ho usato l'interfaccia Collection per questo. Tuttavia, quando uso @GenericGenerator e imposta la strategia su hilo, genera un'eccezione. Ecco il mio codice:La strategia del generatore HiLo non funziona

@Entity 
@Table(name = "USER_DETAILS") 
public class UserDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int userId; 
    private String userName; 

    @ElementCollection 
    @JoinTable(name="USER_ADDRESS", 
     [email protected](name="USER_ID") 
    ) 

    @GenericGenerator(name = "hilo-gen", strategy = "hilo") 
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "hilo-gen", type = @Type(type="long")) 
    private Collection<Address> address = new ArrayList<Address>(); 

    public int getUserId() { 
     return userId; 
    } 

    public void setUserId(int userId) { 
     this.userId = userId; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public Collection<Address> getAddress() { 
     return address; 
    } 

    public void setAddress(List<Address> address) { 
     this.address = address; 
    } 
} 

ottengo la seguente eccezione:

Exception in thread "main" org.hibernate.MappingException: Could not instantiate id generator [entity-name=null] 
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:121) 
    at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:259) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.<init>(AbstractCollectionPersister.java:429) 
    at org.hibernate.persister.collection.BasicCollectionPersister.<init>(BasicCollectionPersister.java:57) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:152) 
    at org.hibernate.persister.internal.PersisterFactoryImpl.createCollectionPersister(PersisterFactoryImpl.java:140) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:408) 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) 
    at com.hbt.HibernateTest.main(HibernateTest.java:35) 
Caused by: java.lang.UnsupportedOperationException: Support for 'hilo' generator has been removed 
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.getIdentifierGeneratorClass(DefaultIdentifierGeneratorFactory.java:132) 
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:112) 
    ... 14 more 

Sto usando l'ultima sospensione. Cosa dovrei fare?

+0

Anche io sto usando MySql come mio database –

risposta

24

Hilo non è più supportato, questo dovrebbe funzionare

@GenericGenerator(name="sequence-gen",strategy="sequence") 
+2

puoi spiegare il motivo della rimozione di "alone"? –

0

È necessario scegliere da una delle strategia Hi/Lo:

Per essere il più vicino possibile al tuo tutorial, cambierei semplicemente "hilo" in "seqhilo" nel tuo codice.

+0

C'è stato qualche cambiamento nell'ultimo stato di ibernazione? Coz il tutorial che sto seguendo usa Hibernate 3.0. E sto usando Hibernate 5.0. L'ultima versione non supporta hilo? –

+0

Non so quando hanno apportato la modifica, ma da quello che so dovresti usare una delle strategie sopra elencate. Per essere il più vicino possibile al tuo tutorial, cambierei semplicemente "hilo" in "seqhilo" –

+0

@AdityaSawant Il supporto per il generatore "hilo" è stato rimosso – kommradHomer

0

Il supporto per 'hilo' generatore è stato rimosso. Per ulteriori informazioni, questo link fornisce l'elenco deprecato.

Per risolvere questo problema, è sufficiente utilizzare il generatore di sequenza . Questo risolverà il tuo problema.

@Entity 
@Table(name = "USER_DETAILS") 
public class UserDetails { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int userId; 
    private String userName; 

    @ElementCollection 
    @JoinTable(name="USER_ADDRESS", 
     [email protected](name="USER_ID") 
    ) 

    @GenericGenerator(name = "sequence-gen", strategy = "sequence") 
    @CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "sequence-gen", type = @Type(type="long")) 
    private Collection<Address> address = new ArrayList<Address>(); 

    public int getUserId() { 
     return userId; 
    } 

    public void setUserId(int userId) { 
     this.userId = userId; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public Collection<Address> getAddress() { 
     return address; 
    } 

    public void setAddress(List<Address> address) { 
     this.address = address; 
    } 
}