2013-12-12 16 views
7

Ho un requisito in cui molte delle mie entità hanno bisogno di un valore Long e una relazione @ManyToOne con qualche altra entità. Questo requisito può essere realizzato facilmente con un MappedSuperclass nel seguente modo:Definisci @UniqueConstraint in @MappedSuperclass

@MappedSuperclass 
    public class BaseEntity { 

     @Column(name = "value", nullable = false) 
     private Long value; 
     @JoinColumn(name = "some_entity_id", nullable = false) 
     @ManyToOne(fetch = FetchType.EAGER) 
     private SomeEntity some; 

Il problema è che il valore lunga e la combinazione entità devono essere unici. È possibile definire l'indice nella superclasse? Se io definisco l'indice nella @Table dell'Ente il codice funziona come previsto

@UniqueConstraint(name = "uq1", columnNames = {"value", "some_entity_id"}) 

La battuta d'arresto è che il vincolo dovrebbe quindi essere replicato lungo tutte le classi figlie e poi tutte le modifiche avrebbe anche bisogno di essere replicato lasciando l'ereditarietà quasi inutile (decisamente non elegante)

Per riassumere la vera domanda: è possibile definire un vincolo univoco composto da @MappedSuperclass? Se la risposta è NO, allora cosa faresti?

PS: So che questo è tutto rilevante solo quando la generazione di tabelle è in vigore, fa parte della nostra politica di codifica e best practice.

+0

E se si crea l'abstract BaseEntity, si passa alle annotazioni getter/setter e si definisce un metodo astratto getId? –

risposta

0

ho potuto digitare questo tutti fuori, o ho potuto solo dare un link ad una soluzione :)

How to use @UniqueConstraint with single table inheritance (JPA)?

In sostanza, non si può ignorare il @Table annotazioni nelle classi estese, tuttavia, è possibile impostare i vincoli univoci in un file orm.xml (a cui si fa riferimento dal proprio persistence.xml).

Ciò significa che è possibile aggiungere un vincolo univoco che verrà ereditato da tutte le classi che estendono la classe base.

Problemi correlati