Erreur JPA: l'entité n'a aucun attribut de clé primaire défini
Je suis en utilisant JPA dans mon application. Dans celui de la table, je n'ai pas utilisé de clé primaire (je sais que c'est une mauvaise conception).
Maintenant générés entité est comme indiqué ci-dessous :
@Entity
@Table(name="INTI_SCHEME_TOKEN")
public class IntiSchemeToken implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="CREATED_BY")
private String createdBy;
@Temporal( TemporalType.DATE)
@Column(name="CREATED_ON")
private Date createdOn;
@Column(name="SCH_ID")
private BigDecimal schId;
@Column(name="TOKEN_ID")
private BigDecimal tokenId;
public IntiSchemeToken() {
}
public String getCreatedBy() {
return this.createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreatedOn() {
return this.createdOn;
}
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
public BigDecimal getSchId() {
return this.schId;
}
public void setSchId(BigDecimal schId) {
this.schId = schId;
}
public BigDecimal getTokenId() {
return this.tokenId;
}
public void setTokenId(BigDecimal tokenId) {
this.tokenId = tokenId;
}
}
Ici, Dans mon projet, eclipse IDE d'ERREUR s'affiche marque(de couleur ROUGE de la croix) de cette classe, et l'erreur est "L'entité n'a pas d'attribut de clé primaire définie".
Quelqu'un peut me dire, Comment faire pour créer une entité sans clé primaire ?
Grâce.
source d'informationauteur Gunjan Shah | 2012-11-02
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas. Une entité DOIT avoir un unique, immuable ID. Il n'a pas à être défini comme clé primaire dans la base de données, mais le champ ou un ensemble de champs doit identifier la ligne, et sa valeur ne peut pas changer.
Donc, si un champ dans votre entité, ou un ensemble de champs dans votre entité satisfait à ces critères, faire le (ou les) ID de l'entité. Par exemple, si il n'y a aucun moyen pour qu'un utilisateur peut créer deux instances de la même journée, vous pouvez faire [createdOn, createdBy] l'ID de l'entité.
Bien sûr c'est une mauvaise solution, et vous devriez vraiment changer votre schéma et ajouter un générée automatiquement, seule la colonne ID de l'entité.
Si votre Clé Primaire(PK) est géré super classe qui est héritée dans une classe d'entité, puis vous devrez inclure le mappé super nom de la classe dans le persistence.xml fichier.
Regard sur le rapport de bug:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=361042
Si vous avez besoin de définir une classe sans clé primaire, alors vous devez marquer cette classe comme une Intégrable classe. Sinon, il faut donner la clé primaire pour toutes les entités que vous souhaitez définir.
Vous pouvez désactiver (changement) de validation qui a été ajouté.
Aller à l'espace de travail des préférences de Persistance Java->APP->Erreurs/Avertissements "suivant" Type "et modifier" l'Entité n'a pas de clé primaire " à "Warnning'.
En plus de http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#No_Primary_Key vous pouvez utiliser de l'accumulation dans les colonnes comme
ROWID
dans Oracle:mais avec des soins:
Entité cadres ne fonctionne pas pour tous les types de données (comme statistiques des données qui a été utilisé pour l'analyse non à l'interrogation).
Une autre solution sans Hibernate
Si
- vous n'avez pas PK sur la table
- il y a une combinaison logique de colonnes pouvant être PK (pas nécessaire si vous pouvez utiliser une sorte de rowid)
-- mais certaines colonnes sont NULLable si vous avez vraiment ne pouvez pas créer de PK en raison de la limitation DB
- et vous ne pouvez pas modifier la structure de la table (de casser insert/select avec pas explicitement les colonnes à l'héritage de code)
alors vous pouvez essayer l'astuce suivante
- créer une vue de la base de données avec colonne virtuelle qui a valeur de concaténées logique colonnes de clé ('A='||a||'B='||'C='c..) ou rowid
- créer votre entité JPA par ce point de vue
marque de la colonne virtuelle avec l'annotation @Id
Que c'est. Mise à jour/suppression des données les opérations sont également possibles (pas d'insert), mais je ne voudrais pas utiliser si le virtuel de la colonne de la clé n'est pas fait de rowid (pour éviter analyse complète des recherches par la table DB)
P. S. La même idée est en partie décrit liée à la question.
Vous avez besoin pour créer une clé primaire ,Si elle ne trouve pas admissibles terrain, puis créer incrément automatique de l'Id.