2011-05-16 7 views
4

J'essaie JPA avec une classe très simple pour le jeu! cadre et j'ai quelques problèmes avec la colonne id.Problème avec la colonne id et JPA

Ma base de données SQL n'a que deux colonnes:

CREATE TABLE IF NOT EXISTS `auto` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

Et mon modèle est:

@Entity 
@Table(name = "auto") 
public class Auto extends Model{ 

    @Column(insertable = false, updatable = false) 
    public int id; 

    public String name; 

    public Auto(String name){ 
     this.name = name; 
    } 
} 

Tout fonctionne très bien sans cette partie:

@Column(insertable = false, updatable = false) 
    public int id; 

Dès que j'ajouter public int id; J'obtiendrais cette erreur si: A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.Auto column: id (should be mapped with insert="false" update="false")

Et c'est la raison pour laquelle j'ai ajouté l'annotation de la colonne, mais il ne fonctionne pas avec que ni, maintenant je reçois:

A javax.persistence.PersistenceException has been caught, org.hibernate.PropertyAccessException: could not set a field value by reflection setter of models.Auto.id

Je teste le modèle de cette façon: new Auto("bmw").save(); save() est une méthode de la classe model dans playframework.

Quelqu'un sait pourquoi j'ai ce problème? Merci!

Répondre

7

Hmm, essayez-le complètement sans le champ id. On dirait que Playframework crée automatiquement un champ Id si la classe Model est étendue. Voir here:

» ... Si vous avez utilisé JPA, vous savez que chaque entité JPA doit fournir une propriété @Id ici le modèle superclasse fournit un identifiant numérique généré automatiquement, et dans la plupart des cas, cela est bon. assez ... "

+1

Même problème lors de l'utilisation de Spring Data JPA et extension d'une entité de AbstractPersistable @kindofwhat: Thx pour me diriger vers la bonne direction! – Sal

2

La classe Model ajoute déjà un champ id, de type Long. Ceci est en conflit avec le champ id que vous ajoutez à votre définition de classe.

Supprimez simplement le champ id de Auto et cela devrait fonctionner. Je ne suis pas sûr si la définition de int (11) dans votre base de données est correcte, mais JPA devrait automatiquement résoudre cela si nécessaire.

+1

Mais dans ce cas, comment puis-je obtenir un identifiant d'objet?Est-ce que cela crée aussi le getter et le setter, et comment s'appellent-ils? – networkprofile

+0

C'est un champ public, vous pouvez donc simplement appeler 'auto.id' et le récupérer. –

1

La colonne ne devrait-elle pas être annotée comme suit?

@Id 
@GeneratedValue(generator="???_seq",strategy=GenerationType.SEQUENCE) 
2

Le problème que vous rencontrez rapporte à sous-estimer ce que vous obtenez pour'free' dans le cadre de jeu.

L'ID (votre question initiale) et les getters et setters (votre commentaire de suivi) sont générés automatiquement pour vous. Le champ id provient de la classe Model, que vous étendez, et les getters et setters sont automatiquement générés et utilisés lorsque vous créez un champ public dans votre modèle, puis vous y référer plus tard en tant que model.field.

Bien que tous les modèles disposent d'un ID, il est recommandé d'utiliser vos propres ID personnalisés s'ils doivent faire quelque chose de plus complexe ou significatif.

0

Si vous devez ajouter votre propre champ d'ID (par exemple, car il doit être un entier plutôt qu'un long), vous pouvez étendre GenericModel plutôt que Model.