2016-01-14 26 views
6

La mia situazione è descritta qui:È corretto disporre di un generatore di duplicati denominato definito in questa unità di persistenza?

eclipse Duplicate generator named "ID_GENERATOR" defined in this persistence unit

Tuttavia la mia domanda è diversa e la risposta selezionata non lo risolve:

"E 'valida per avere @SequenceGenerator multipla con lo stesso nome anche se è utilizzato a questo scopo Hibernate : How override an attribute from mapped super class? "

Se non valido, c'è un'alternativa?

Grazie mille per la risposta.

+0

Penso che sia valido, perché alla fine della giornata, questo è solo il modo in cui Hibernate mapperà l'entità alla sequenza che genererà l'ID quando lo manterrà nel DB. Ad esempio, Oracle non si cura delle tabelle che usano quale sequenza, poiché la sequenza stessa è un'entità indipendente. IMO questo avviso (o errore) ha più senso in base al DBMS che stai utilizzando. IMO, disabiliterei semplicemente l'avviso di errore in eclissi. – Leo

+0

Grazie Leo. Il tuo commento potrebbe essere una risposta valida. – fabien7474

risposta

2

Secondo sezione 11.1.48 SequenceGenerator Annotation della specifica JPA 2.1:

La portata del nome generatore è globale all'unità di persistenza (in tutti i tipi di generatori).

Quindi non è possibile avere generatori duplicati.

Se si tenta di aggiungere i seguenti due entità:

@Entity(name = "Post") 
public static class Post { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pooled") 
    @GenericGenerator(
     name = "pooled", 
     strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
     parameters = { 
      @Parameter(name = "sequence_name", value = "sequence"), 
      @Parameter(name = "initial_value", value = "1"), 
      @Parameter(name = "increment_size", value = "5"), 
     } 
    ) 
    private Long id; 
} 

@Entity(name = "Announcement") 
public static class Announcement { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pooled") 
    @GenericGenerator(
      name = "pooled", 
      strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
      parameters = { 
       @Parameter(name = "sequence_name", value = "sequence"), 
       @Parameter(name = "initial_value", value = "1"), 
       @Parameter(name = "increment_size", value = "10"), 
      } 
    ) 
    private Long id; 
} 

Hibernate genererà il seguente messaggio di errore:

più riferimenti a sequenza di database [sequenza] sono state riscontrate il tentativo di impostare in conflitto valori per 'incrementare la dimensione'. Trovato [10] e [5]

Questo perché il generatore di identificatore è globale e le due configurazioni di sequenza sarà in conflitto.

+0

grazie. Quindi non è valido quali alternative posso usare per la mia situazione? – fabien7474

+0

L'unica soluzione è evitare generatori duplicati. –

+0

Come descritto nella mia interrogazione, ho più sotto-classi che ereditano da una classe astratta BaseEntity avendo il @Id definito lì. Cosa devo fare se voglio generare una sequenza ID univoca per ogni sottoclasse? – fabien7474

1

Penso che sia valido, perché alla fine della giornata, questo è solo il modo in cui Hibernate mapperà l'entità alla sequenza che genererà l'ID quando lo manterrà nel DB. Ad esempio, Oracle non si cura delle tabelle che usano quale sequenza, poiché la sequenza stessa è un'entità indipendente. IMO questo avviso (o errore) ha più senso in base al DBMS che stai utilizzando. IMO, disabiliterei semplicemente l'avviso di errore in eclissi.