Domanda

La seguente definizione di colonna JPA genera un "intero" " tipo di dati per impostazione predefinita su tutti i database (ad es. h2, mysql, postgres)

@Column(name = "type", nullable = false)
@Type(type = "com.mycompany.hibernate.usertype.GenericEnumUserType", parameters = {
        @Parameter(name = "enumClass", value = "com.mycompany.model.DegreeType"),
        @Parameter(name = "identifierMethod", value = "toInt"),
        @Parameter(name = "valueOfMethod", value = "fromInt") })
@NotNull
private DegreeType type;

Vorrei utilizzare una memoria minima per questo campo e quindi preferirei utilizzare il parametro columnDefinition per la generazione di schema2ddl. Ma sembra che tinyint non sia supportato in Postgres, ma sia supportato in altri database di cui sopra.

Sarebbe possibile generare diversi file SQL in base al tipo di database. 1. Quale sarebbe l'approccio migliore per raggiungere questo obiettivo? 2. Quale sarebbe il miglior tipo di dati (con memoria minima) che può essere utilizzato a questo scopo? Sarebbe piccolo

È stato utile?

Soluzione

Dato che stai usando un tipo personalizzato (perché?), le definizioni di colonna sottostanti verranno generate in base al risultato del metodo sqlTypes () del tuo tipo. Il tipo di colonna SQL effettivo sarebbe ottenuto dall'appropriato dialetto .

Quindi, se sqlTypes () dovesse restituire new int [] {Types.TINYINT} , il dialetto PostgresQL lo mapperebbe su int2 e da H2 / MySQL a tinyint .

Detto ciò, in generale consiglierei di:

  1. Usa supporto enum integrato tramite l'annotazione @Enumerated .
  2. Memorizza il valore enum come stringa anziché intero. L'uso di quest'ultimo consente di risparmiare spazio, ma introduce un enorme potenziale problema: 3 mesi (anni) lungo la linea qualcuno cambia il codice inserendo un'altra costante enum nel mezzo del tuo tipo e improvvisamente tutti i tuoi dati diventano invalidi. Lo spazio su disco è economico; affrontare problemi del genere non lo è.

    @Enumerated(EnumType.STRING)
    @Column(name = "degree_type", nullable = false, length=!0)
    private DegreeType type;
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top