J'effectue la mise à jour par lots hibernate jpa et sa donne l'erreur suivante
2015-04-21 15:53:51,907 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) SQL Error: 0, SQLState: 42P01
2015-04-21 15:53:51,908 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Thread-283 (HornetQ-client-global-threads-462057890)) ERROR: relation "my_seq_gen" does not exist
J'utilise la base de données postgres et mon identifiant est généré automatiquement
@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;
Ceci est mon extrait de code d'insertion de lot
getEm().getTransaction().begin();
System.out.println("transaction started--------------");
try {
for (Receipt ReceiptEntity : arrReceiptEntity) {
getEm().persist(ReceiptEntity);
}
getEm().getTransaction().commit();
System.out.println("commited");
} catch (Exception exception) {
System.out.println("error----------------------------------------------------------------------");
if(getEm().getTransaction().isActive())
getEm().getTransaction().rollback();
LOG.error(exception);
} finally {
getEm().flush();
getEm().clear();
getEm().close();
}
J'ai ajouté la propriété suivante dans persistence.xml
<property name="hibernate.id.new_generator_mappings" value="true"/>
S'il vous plaît suggérer ce que je fais mal.
Essayez d’annoter votre id
avec @Id
et @GeneratedValue(strategy=GenerationType.IDENTITY)
. Cela a fonctionné pour moi avec PostgreSql.
UPDATE: Cela ne fonctionnera que si votre colonne id a été déclarée comme étant de type SERIAL
ou BIGSERIAL
.
Si vous ne souhaitez pas modifier la définition de votre entité, vous devez créer une séquence dans votre schéma postgreSQL avec le nom hibernate_sequence
.
CREATE SEQUENCE hibernate_sequence START 1;
METTRE &AGRAVE; JOUR:
Il manque la seconde séquence generatef, que vous avez définie pour votre entité, ajoutez-la simplement comme la précédente
CREATE SEQUENCE my_seq_gen START 1;
Didacticiel utile: http://www.concretepage.com/hibernate/generatedvalue-strategy-generationtype-sequence-hibernate
J'espère que vous aurez la réponse, mais si vous trouvez toujours la réponse, cela pourrait être utile.
J'ai eu le même problème et je l'ai résolu en annotant la méthode getter de l'id avec @SequenceGenerator
et @GeneratedValue
.
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN", initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.SEQUENCE, generator="seq-gen")
public int getId(){
return id;
}
Pouvez-vous essayer de suivre:
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "auto_gen")
@SequenceGenerator(name = "auto_gen", sequenceName = "A")
@Column(name = "ID")
private int id;
Merci
J'avais le même problème. J'ai résolu de mettre l'incrémentation automatique sur la colonne id de la table sur postgres cela fonctionne, comme ça.
ALTER TABLE mytable ALTER COLUMN id SET DEFAULT nextval('mytable_id_seq');
ALTER SEQUENCE mytable_id_seq OWNED BY mytable.id;
Dans mon cas, ajouter la propriété name = "hibernate.hbm2ddl.auto" value = " update " a résolu le problème. Vous devez ajouter la propriété mentionnée dans persistence.xml
Selon un post, hibernate ne pourrait pas obtenir la valeur de séquence suivante , définissez votre colonne @GeneratedId avec la stratégie GenerationType.IDENTITY au lieu de GenerationType.SEQUENCE. Donc, vous auriez
@Id
@SequenceGenerator(name="seq-gen",sequenceName="MY_SEQ_GEN"initialValue=205, allocationSize=12)
@GeneratedValue(strategy= GenerationType.IDENTITY, generator="seq-gen")
@Column(name="\"ID\"",unique=true,nullable=false)
private int id;
Parfois, avec l'annotation @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
vous pouvez avoir votre séquence avec intervalles vides (après suppression) et position d'auto-incrémentation suivante incorrecte . Essayez de définissez la valeur d'auto-incrémentation suivante sur la position après la plus grande valeur id:
ALTER SEQUENCE schema.entity_id_seq RESTART WITH 40072;