2010-05-25 5 views
4

J'ai une colonne dans ma base de données qui est définie avec l'identité (1,1) et je ne peux pas obtenir des annotations d'hibernation pour travailler pour elle. J'ai des erreurs quand j'essaye de créer un nouvel enregistrement.Hibernate Auto-Increment ne fonctionne pas

Dans mon entité j'ai ce qui suit. Mais quand j'essaie d'ajouter un nouvel enregistrement, j'obtiens l'erreur suivante.

Impossible d'insérer une valeur explicite pour la colonne d'identité dans la table 'MemberSelectedOptions' lorsque IDENTITY_INSERT est défini sur OFF. Je ne veux pas définir IDENTIY_INSERT sur ON car je veux que la colonne d'identité dans la base de données gère les valeurs.

Le code SQL exécuté est le suivant; où vous pouvez voir clairement l'insert.

insert into dbo.MemberSelectedOptions 
    (OptionStatusCd, 
    EffectiveDate, 
    TermDate, 
    SelectionStatusDate, 
    SysLstUpdtUserId, 
    SysLstTrxDtm, 
    SourceApplication, 
    GroupId, 
    MemberId, 
    OptionId, 
    SeqNo) 
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

Que manque-t-il?

+0

J'ai mis à jour le post pour inclure le fichier entier sans getters/setters. – dharga

+0

Je pense, nous devrions faire Hibernate pour ne pas insérer 'SeqNo'. Le marquage possible du getter 'SeqNo' comme' @ Id' et ne pas utiliser 'generator' aidera. –

+0

J'ai essayé de définir insertable = false et updateble = false, mais cela n'a pas aidé. – dharga

Répondre

0

Vous pouvez éventuellement marquer votre champ avec @id et ne pas spécifier la propriété generator.

Comme montré dans Hibernate Annotation - 2.2.3.1. Generating the identifier property, l'exemple suivant utilise le générateur d'identité:

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
public Long getId() { ... } 
+0

Mon ID est composite, j'ai mis à jour le poste avec l'ensemble du fichier – dharga

+0

Cela ne fonctionne pas pour @Embeddable. – iddqd

0

cette combinaison fonctionne très bien pour moi:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
1

Lorsque vous utilisez @Embeddable ou @EmbeddedId, les valeurs de clé primaire sont supposé être fourni par l'application (c'est-à-dire constitué de valeurs non générées). Votre annotation @GeneratedValue est simplement ignorée.

+0

C'était ma configuration d'origine, et il a produit la même erreur. J'ai reçu la suggestion "native" d'un autre poste de SOF. – dharga

0

Vous ne pouvez pas utiliser des générateurs sur les touches composites

1

Voici l'exemple de le faire

@Id 
@Column(name = "col_id") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long    colId; 
+0

cela crée une clé aléatoire – Joset

0

Vous ne pouvez pas le faire avec Créer la table manuellement et tout sera ok.

CREATE TABLE `Forum` (
    `name` varchar(255) NOT NULL, 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `body` varchar(500) DEFAULT NULL, 
    PRIMARY KEY (name,`id`), 
    UNIQUE KEY `id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin2 




import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.EmbeddedId; 
import javax.persistence.Entity; 

@Entity 
public class Forum implements Serializable { 

    @EmbeddedId 
    private ForumCompositePK forumPK; 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 7070007885798411858L; 

    @Column(length = 500) 
    String body; 

    public String getBody() { 
     return body; 
    } 

    public void setBody(String body) { 
     this.body = body; 
    } 

    public void setForumPK(ForumCompositePK forumPK) { 
     this.forumPK = forumPK; 
    } 

    public ForumCompositePK getForumPK() { 
     return forumPK; 
    } 

} 




import java.io.Serializable; 

import javax.persistence.Column; 
import javax.persistence.Embeddable; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 

@Embeddable 
public class ForumCompositePK implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8277531190469885913L; 


    @Column(unique=true,updatable=false,insertable=false) 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer id; 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 



}