Problemas ao salvar data no postgres, data salvando como 1996-12-31

Eu recebo uma data de um formulário, e converto ela pra poder salvar no meu banco no postgres, só que sempre salva com a data de 1969-12-31. Se alguém puder me dar um norte onde eu tô errando.

Meu código

//Abaixo se encontra o meu formulário, nele eu coloco a data de nascimento

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui" 
xmlns:adm="http://github.com/adminfaces"
template="/WEB-INF/templates/template.xhtml">

<ui:define name="head">
        
</ui:define>

<ui:define name="title">
Cadastro de pessoa
</ui:define>

<ui:define name="body">
<h:form id="cadastroPessoa">
<div class="ui-g-12">
<p:outputLabel for="datanascimento" value="Data de nascimento:*"/>
</div>
<div class="ui-g-12">
<p:inputMask id="datanascimento" mask="99/99/9999"/>
</div>
</h:form>
</ui:define>
</ui:composition>

//Aqui está o meu managed bean, onde eu recebo a data, e preparo ela no formato aceito pelo postgres, e salvo no atributo

public void salvarPessoa() {
Pessoa pessoa = new Pessoa(); 
HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();

String datanascimento =request.getParameter("cadastroPessoa:datanascimento");

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date dataNasc = dateFormat.parse(datanascimento);
pessoa.setDataNasc(dataNasc);

}

//Esse é o meu método DAO, que salva no banco

public void CadastrarUsuario(Pessoa a) {
Connection con = Conexao.getConnection();
PreparedStatement stmt = null;
try {
String sql = "INSERT INTO pessoa (datanascimento) VALUES(?)";
stmt = con.prepareStatement(sql, stmt.RETURN_GENERATED_KEYS);
stmt.setDate(1, new java.sql.Date(a.getDataNasc().getDate()));
final ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
a.setUltimaId(rs.getInt(1));
ultimaId = a.getUltimaId();
}
} catch (SQLException ex) {
System.out.println(ex);
} finally {
Conexao.closeConnection(con, stmt);
}
}

O que eu não entendo, é em que ponto ele perde a data que veio no formulário, e salva como 1996-12-31

E qual seria a data correta?

Qualquer outra válida, independente da data que eu colocar, ele transformar nessa

Você já testou a saída de dataNasc para ver como está? Além disso, java.sql.Date deve receber um long que é obtido chamando o método getTime da classe java.util.Date. Logo:

stmt.setDate(1, new java.sql.Date(a.getDataNasc().getTime()));

vou tentar aqui, muito obrigado

Primeiramente, obrigado pela ajuda, mas ainda não deu certo, nem com o .getTime(), se puder me dar mais uma ideia do que pode ser.

No meu BEAN, a data vai assim antes de ir pro meu método DAO que salva no banco, eu só gostaria de saber se isso está certo ou não:

Data bean:Mon May 19 00:00:00 BRT 21

Foi utilizado a data 15/12/1997 no exemplo, e no banco salva como:
“0021-05-19”

Se foi salvo como 0021/05/19, evidente que está errado, pois deveria ser 2020/05/13, se for o dia de hoje e 2021/05/19 se for uma data futura.
Veja quanto vale dataNasc no DAO colocando um sisout logo depois da declaração do método cadastrarUsuario:

public void cadastrarUsuario(Pessoa a) {
	System.out.println(a.getDataNasc() instanceof java.util.Date)
	System.out.println(a.getDataNasc());
	
	/*Connection con = Conexao.getConnection();
	PreparedStatement stmt = null;
	
	try{
		String sql = "INSERT INTO pessoa (datanascimento) VALUES(?)";
		stmt = con.prepareStatement(sql, stmt.RETURN_GENERATED_KEYS);
		stmt.setDate(1, new java.sql.Date(a.getDataNasc().getDate()));
		final ResultSet rs = stmt.getGeneratedKeys();
		if (rs.next()){
			a.setUltimaId(rs.getInt(1));
			ultimaId = a.getUltimaId();
		}
	}catch (SQLException ex){
		System.out.println(ex);
	}finally{
		Conexao.closeConnection(con, stmt);
	}*/
}

Daí veja o que aparece.

Observação: por convenção, a primeira letra de um método é grafada em minúsculo.

Boa noite;

Então, esses dois prints me retornam respectivamente o seguinte:

true
Mon May 19 00:00:00 BRT 21

Eu coloquei vários println em diversos pontos, e do formulário ele tá recebendo certo, o problema é a partir do dateFormat.parse(datanascimento), no qual ele me retorna:

Mon May 19 00:00:00 BRT 21

Eu vou pesquisar o que pode ser, mas se você já teve o problema antes, e puder dar uma luz eu te agradeço.

Resolvido trocando o Date por LocalDate

DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
LocalDate data = LocalDate.parse(datanascimento, formato); 

Obrigado pelo tempo e pelas dicas!

O problema não era a classe a ser usada mas o formato da data…

Tinhas diferentes formatos de data, a escrever e ler.

<p:inputMask id="datanascimento" mask="99/99/9999"/>
(...)
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

Com o LocalDate funciona porque estás a usar o mesmo formato:

DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/yyyy");