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.
E se si crea l'abstract BaseEntity, si passa alle annotazioni getter/setter e si definisce un metodo astratto getId? –