Question

J'ai une classe mappée comme une entité à persister dans une base de données. Je un champ identifiant comme clé primaire de sorte que chaque fois que l'objet est conservée la valeur de l'identifiant est récupéré à partir de la séquence « myClass_pk_seq », un code comme le suivant.

@Entity
@Table(name="myObjects")
public class MyClass {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
    @Column(name="myClassId")
    private Integer id;

    private Integer code;


    ...
}

Je dois faire quelque chose d'attribut « code » similaire à id. Je dois avoir une séquence que je puisse attribuer au code la valeur suivante de la séquence (à la réserve que la valeur dans le cas où l'utilisateur souhaite réserver mais sans persistance des données). Je veux dire que l'utilisateur verra le terrain, s'il ne sait pas quoi entrer, il peut appuyer sur un bouton et receieve dans l'écran de la prochaine valeur possible (et il peut ou non accepter). Comment puis-je obtenir la valeur suivante d'une séquence définie dans JPA (et augmenter sa valeur) sans persistance des données pour un champ de clé non primaire?

Je veux juste avoir une méthode qui font appel nextval sur une séquence associée à champ « code », et renvoie la valeur. Quelle est la meilleure façon de le faire avec annotations JPA?

Merci.

Était-ce utile?

La solution

  

Je veux juste avoir une méthode qui font appel nextval sur une séquence associée à champ « code », et renvoie la valeur. Quelle est la meilleure façon de le faire avec annotations JPA?

  • Utiliser SQL natif pour obtenir la prochaine valeur de la séquence lorsque l'utilisateur appuie sur le bouton. Vous pouvez soit créer la séquence manuellement ou utiliser une « entité faux » pour avoir JPA créer pour vous.
  • Si vous ne souhaitez pas utiliser SQL natif, insérer une entité reposant sur la séquence et obtient son identifiant.

Les deux solutions semble un peu laid. Peut-être vous pouvez simplement utiliser un générateur aléatoire comme un générateur UUID.

En fait, vous ne l'avez pas mentionné quoi que ce soit au sujet de l'unicité de la code (et les annotations JPA ne le montrent pas doit être unique). Pourquoi ne pas revenir un int aléatoire?

Autres conseils

Voir une autre question / réponses au sujet de séquence en utilisant définie ailleurs que les champs id . Vous pouvez créer une entité faux avec un champ (de type Long ID). Connectez-vous à la séquence définie dans la DB. Ensuite, créez une implémentation CrudRepository pour cette entité et appeler sa méthode save () avec une instance vide de l'objet entité fausse que vous avez défini. Mise en veille prolongée fonctionnera pour vous un « select YOUR_SEQ.NEXTVAL de double » requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top