Secondo me ti stai complicando la vita.
Ho voluto realizzare un esempio, utilizzando MySQL, per verificare come vengono trattati i tipi di data/ora (io solitamente lavoro su SQL Server, quindi per non sbagliare, ho installato l'ultima versione LTS di MySQL disponibile e ho realizzato l'esempietto).
Ho creato un database e ho definito la seguente tabella (nome: "registro"):

Come puoi vedere ho tre campi di tipo data/ora:
dataProtocollo di tipo DATE (può contenere solo date senza indicazione di orario)
oraProtocollo di tipo TIME (può contenere solo orari)
timeStampRegistro di tipo DATETIME (contiene sostanzialmente dei timestamp, quindi un valore di DATA + ORA)
Poi ho creato un'applicazione SpringBoot.
Qui di seguito l'entity che mappa quella tabella:
package test.demo.entities;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@Entity
@Table(name = "registro")
public class Registro implements java.io.Serializable {
@Id
@Column(name = "idRegistro")
private Integer idRegistro;
@Column(name = "cognome", length=80)
private String cognome;
@Column(name = "nome", length=80)
private String nome;
@Column(name = "dataProtocollo")
private LocalDate dataProtocollo;
@Column(name = "oraProtocollo")
private LocalTime oraProtocollo;
@Column(name = "timeStampRegistro")
private LocalDateTime timeStampRegistro;
public Integer getIdRegistro() {
return idRegistro;
}
public void setIdRegistro(Integer idRegistro) {
this.idRegistro = idRegistro;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public LocalDate getDataProtocollo() {
return dataProtocollo;
}
public void setDataProtocollo(LocalDate dataProtocollo) {
this.dataProtocollo = dataProtocollo;
}
public LocalTime getOraProtocollo() {
return oraProtocollo;
}
public void setOraProtocollo(LocalTime oraProtocollo) {
this.oraProtocollo = oraProtocollo;
}
public LocalDateTime getTimeStampRegistro() {
return timeStampRegistro;
}
public void setTimeStampRegistro(LocalDateTime timeStampRegistro) {
this.timeStampRegistro = timeStampRegistro;
}
}
L'applicazione si limita a creare un'oggetto Registro, stampare a video i tre valori dataProtocollo, oraProtocollo e timeStampRegistro, salvare l'entity a DB, poi andarla a rileggere e stampare nuovamente i tre valori appena riletti dalla tabella del DB.
@Autowired
private RegistroRepository repo;
@Override
public void run(String... args) {
LocalDate oggi = LocalDate.now();
LocalTime adesso = LocalTime.now();
LocalDateTime timeStamp = LocalDateTime.now();
Registro reg = new Registro();
reg.setIdRegistro(0);
reg.setCognome("Rossi");
reg.setNome("Mario");
reg.setDataProtocollo( oggi );
reg.setOraProtocollo( adesso );
reg.setTimeStampRegistro( timeStamp );
System.out.println("Creo entity via Java:");
System.out.println("Data protocollo: " + oggi.toString());
System.out.println(" Ora protocollo: " + adesso.toString());
System.out.println(" Timestamp: " + timeStamp.toString());
System.out.println("Scrivo record in tabella");
repo.saveAndFlush( reg );
System.out.println("Rileggo entity da DB:");
Registro regLetta = repo.findById(0).orElse( null );
if (regLetta != null) {
System.out.println("Data protocollo: " + regLetta.getDataProtocollo().toString());
System.out.println(" Ora protocollo: " + regLetta.getOraProtocollo().toString());
System.out.println(" Timestamp: " + regLetta.getTimeStampRegistro().toString());
}
}
Qui l'output del programma:

Qui lo screenshot dei dati contenuti nella tabella:

Come puoi vedere non ci sono problemi di TimeZone. L'esecuzione è stata da me effettuata effettivamente alle ore 12:14:03 ora italiana.
La mia macchina, dove gira sia il DBMS MySQL, sia l'applicazione Java, è un PC Windows 10 con le impostazioni del fuso orario impostate sul fuso orario di Roma.
Come puoi vedere ho semplicemente creato gli oggetti LocalDate, LocalTime e LocalDateTime e li ho usati direttamente per valorizzare i campi dell'entità.