[JAVA] [VBA] J'ai créé un outil pour convertir le type primitif de la classe Entity générée par Hibernate Tools en type de référence correspondant.

Hibernate Outils qui peuvent créer instantanément la classe Entity correspondante en fonction de la définition de table et de la définition VIEW. C'est très pratique, mais par défaut, les types numériques sont créés en tant que types primitifs. Si la valeur DB peut contenir null, c'est NG. J'ai recherché un paramètre qui pourrait être converti dans le type de référence correspondant (null est acceptable contrairement au type primitif), mais il n'est pas sorti ... Si tel est le cas, il est plus rapide de le faire! J'ai donc créé un outil pour réaliser ce qui précède.

environnement

Créer une classe d'entité

Comment créer une classe d'entité dans Hibernate Tools

Puisqu'il est décrit en détail dans, je vais l'omettre dans cet article.

Table de correspondance des types de données

Les types de données MySQL (ci-après, MySQL), les types de données Java générés par Hibernate Tools (ci-après, Hibernate Tools) et les types de référence correspondants sont les suivants. (Ce sera le résultat de l'exécution réelle des outils Hibernate.)

MySQL HibernateTools(Java) Type de référence correspondant(Java)
INTEGER int Integer
INT int Integer
TINYINT byte Byte
SMALLINT short Short
MEDIUMINT int Integer
BIGINT BigInteger -
DECIMAL BigDecimal -
NUMERIC BigDecimal -
FLOAT float Float
DOUBLE double Double
BIT byte Byte

Étant donné que BigInteger et BigDecimal sont des types de référence, aucune conversion n'est requise, les types de référence correspondants ne sont donc pas écrits. Même dans ce cas, INTEGER est affiché en tant qu'Integer et BIGINT est sorti aussi longtemps, n'est-ce pas?

code

Sur la base de ce qui précède, j'ai créé le code VBA. (Il existe des conversions autres que le type numérique.)

python


Sub macro_for_entity_class_java()

    Dim filePath As String 'Pour obtenir le chemin du fichier
    Dim javaFile As String 'Pour l'acquisition de fichiers Java
    
    Dim FSO As Object 'Pour le traitement des fichiers
    
    Dim replaceContent As String  'Pour la conversion de chaînes de caractères
    
    Dim reg As Object 'Pour les objets d'expression régulière (@Utilisé pour remplacer JoinColumn)
    Set reg = CreateObject("VBScript.RegExp")  'Paramètres des objets d'expression régulière
    
    'Obtenez le chemin du fichier Excel
    filePath = ThisWorkbook.Path
    'Récupérez le fichier Java dans le même fichier que le fichier Excel
    javaFile = Dir(filePath & "\*.java")
    
    'Ouvrez les fichiers Java dans l'ordre et exécutez le traitement
    Do While javaFile <> ""
    
        'Ouvrez un fichier Java et lisez le contenu
        Set FSO = CreateObject("Scripting.FileSystemObject")
        With FSO.GetFile(filePath & "\" & javaFile).OpenAsTextStream
            replaceContent = .ReadAll
            .Close
        End With
        
        ' boolean → Boolean
        replaceContent = replace(replaceContent, "private boolean", "private Boolean")
        replaceContent = replace(replaceContent, "public boolean get", "public Boolean get")
        replaceContent = replace(replaceContent, "(boolean", "(Boolean")
        
        ' byte → Byte
        replaceContent = replace(replaceContent, "private byte", "private Byte")
        replaceContent = replace(replaceContent, "public byte get", "public Byte get")
        replaceContent = replace(replaceContent, "(byte", "(Byte")
        
        ' short → Short
        replaceContent = replace(replaceContent, "private short", "private Short")
        replaceContent = replace(replaceContent, "public short get", "public Short get")
        replaceContent = replace(replaceContent, "(short", "(Short")
        
        ' int → Integer
        replaceContent = replace(replaceContent, "private int", "private Integer")
        replaceContent = replace(replaceContent, "public int get", "public Integer get")
        replaceContent = replace(replaceContent, "(int", "(Integer")
        
        ' long → Long
        replaceContent = replace(replaceContent, "private long", "private Long")
        replaceContent = replace(replaceContent, "public long get", "public Long get")
        replaceContent = replace(replaceContent, "(long", "(Long")
        
        ' float → Float
        replaceContent = replace(replaceContent, "private float", "private Float")
        replaceContent = replace(replaceContent, "public float get", "public Float get")
        replaceContent = replace(replaceContent, "(float", "(Float")
        
        ' double → Double
        replaceContent = replace(replaceContent, "private double", "private Double")
        replaceContent = replace(replaceContent, "public double get", "public Double get")
        replaceContent = replace(replaceContent, "(double", "(Double")
        
        'Object → String (par rapport au type JSON; à l'exclusion des classes pour PK)
        If InStr(javaFile, "PK.java") = 0 Then
            replaceContent = replace(replaceContent, "private Object", "private String")
            replaceContent = replace(replaceContent, "public Object get", "public String get")
            replaceContent = replace(replaceContent, "(Object", "(String")
        End If
        
        ' @"Insérable" dans la colonne de jointure= false, updatable =Ajout de "faux"
        reg.Pattern = "(.+?)@JoinColumn\((.+?)\)"
        reg.IgnoreCase = False
        reg.Global = True
        replaceContent = reg.replace(replaceContent, "$1@JoinColumn($2, insertable = false, updatable = false)")
        
        'Supprimez le fichier d'origine et sortez le fichier qui décrit le contenu après le remplacement
        FSO.GetFile(filePath & "\" & javaFile).Delete
        FSO.CreateTextFile (filePath & "\" & javaFile)
        With FSO.GetFile(filePath & "\" & javaFile).OpenAsTextStream(8)
            .Write replaceContent
            .Close
        End With
        
        'Obtenez le fichier Java suivant
        javaFile = Dir
        
    Loop
    
End Sub

Information supplémentaire

Journal des modifications

--2020 / 06/17: Ajout d'une table de correspondance des types de données et correction de certains contenus --2020 / 06/19: Ajout de la méthode de conversion de JSON en objet Java et suppression des futurs problèmes. --2020 / 07/05: Ajout du traitement correspondant à l'erreur "Colonne répétée dans le mappage pour l'entité" de JPA, ajout du référentiel GitHub

référence

■VBA

■MySQL

■Java

Recommended Posts

[VBA] J'ai créé un outil pour convertir le type primitif de la classe Entity générée par Hibernate Tools en type de référence correspondant.
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
J'ai essayé de créer un outil de comparaison des prix des produits Amazon dans le monde entier avec Java, l'API Amazon Product Advertising, l'API Currency (29/01/2017)
J'ai essayé de convertir l'exemple d'application en microservice selon l'idée du livre "Microservice Architecture".
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai créé un client RESAS-API en Java
J'ai essayé de me permettre de définir le délai pour le client Android UDP
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
J'ai créé un outil pour afficher la différence du fichier CSV
J'ai essayé de créer un exemple de programme en utilisant le problème du spécialiste des bases de données dans la conception pilotée par domaine
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
Comment faire de https le schéma de l'URL générée par l'assistant d'URL de Rails
Une histoire où j'ai essayé de faire une vidéo en liant Traitement et Resolume
Ce que j'ai essayé quand je voulais obtenir tous les champs d'un haricot
J'ai essayé de générer automatiquement une classe à convertir d'une classe de données en un bundle avec APT
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Faire une marge à gauche du TextField
J'ai essayé de développer un outil de gestion des effectifs
J'ai essayé de créer une fonction de message de l'extension Rails Tutorial (Partie 1): Créer un modèle
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
Je veux appeler une méthode d'une autre classe
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé de faire une fonction de réponse de l'extension Rails Tutorial (Partie 3): Correction d'un malentendu des spécifications
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé de créer une fonction de message pour l'extension Rails Tutorial (Partie 2): Créer un écran à afficher
J'ai essayé un puzzle qui ne peut être résolu que par les 10% de mauvais ingénieurs