Annotazione @UniqueConstraint in Java


168

Ho un bean Java. Ora, voglio essere sicuro che il campo dovrebbe essere unico.

Sto usando il seguente codice:

@UniqueConstraint(columnNames={"username"})
public String username;

Ma sto ricevendo un errore:

@UniqueConstraint is dissallowed for this location

Qual è il modo corretto di utilizzare vincoli univoci?

Nota: sto usando Play Framework.


15
"Ma sto riscontrando qualche errore." Specifica sempre quale errore stai ricevendo nella domanda. Hai informazioni pertinenti che potrebbero benissimo aiutarci a risolvere il tuo problema, non tenerlo per te.
Jon Skeet,

Sarebbe possibile usare l'annotazione @id?
Albinoswordfish,

Risposte:


414

Per garantire che un valore di campo sia univoco, puoi scrivere

@Column(unique=true)
String username;

L'annotazione @UniqueConstraint serve per annotare più chiavi univoche a livello di tabella, motivo per cui viene visualizzato un errore durante l'applicazione a un campo.

Riferimenti (JPA TopLink):


17
È importante notare che funzionerà solo se lasci che JPA crei i tuoi tavoli
naoru,

118

È possibile utilizzare a livello di classe con la seguente sintassi

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"username"})})
public class SomeEntity {
    @Column(name = "username")
    public String username;
}

41

Attualmente sto utilizzando anche Play Framework con l'ibernazione e l'annotazione JPA 2.0 e questo modello funziona senza problemi

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames = {"id_1" , "id_2"})})
public class class_name {

@Id
@GeneratedValue
public Long id;

@NotNull
public Long id_1;

@NotNull
public Long id_2;

}

Spero che abbia aiutato.


20

Nota: in Kotlin viene utilizzata la sintassi per dichiarare le matrici nelle annotazioni arrayOf(...)anziché{...}

@Entity
@Table(uniqueConstraints=arrayOf(UniqueConstraint(columnNames=arrayOf("book", "chapter_number"))))
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

Nota: a partire da Kotlin 1.2 è possibile utilizzare la [...]sintassi in modo che il codice diventi molto più semplice

@Entity
@Table(uniqueConstraints=[UniqueConstraint(columnNames=["book", "chapter_number"])])
class Chapter(@ManyToOne var book:Book,
              @Column var chapterNumber:Int)

13

Way1:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames = "column1"),@UniqueConstraint(columnNames = "column2")})

- Qui sia Column1 che Column2 agiscono separatamente come vincoli univoci. Esempio: se in qualsiasi momento il valore di column1 o column2 corrisponde, riceverai l'errore UNIQUE_CONSTRAINT.

Way2:

@Entity

@Table(name = "table_name", uniqueConstraints={@UniqueConstraint(columnNames ={"column1","column2"})})

- Qui sia i valori combinati colonna1 che colonna2 agiscono come vincoli univoci


4
   @Entity @Table(name = "stock", catalog = "mkyongdb",
   uniqueConstraints = @UniqueConstraint(columnNames =
   "STOCK_NAME"),@UniqueConstraint(columnNames = "STOCK_CODE") }) public
   class Stock implements java.io.Serializable {

   }

Vincoli univoci utilizzati solo per la creazione di una chiave composita, che sarà unica e rappresenterà la tabella come chiave primaria combinata come unica.


3

puoi utilizzare @UniqueConstraint a livello di classe, per la chiave primaria combinata in una tabella. per esempio:

 @Entity
 @Table(name = "PRODUCT_ATTRIBUTE", uniqueConstraints = {
       @UniqueConstraint(columnNames = {"PRODUCT_ID"}) })

codice categoria ProductAttribute {}


1

L'annotazione univoca deve essere posizionata proprio sopra la dichiarazione dell'attributo. UniqueContraints va nell'annotazione @Table sopra la dichiarazione della classe di dati. Vedi sotto:

@Entity
@Table(uniqueConstraints= arrayOf(UniqueConstraint(columnNames = arrayOf("col_1", "col_2"))))
data class Action(
        @Id @GeneratedValue @Column(unique = true)
        val id: Long?,
        val col_1: Long?,
        val col_2: Long?,
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.