Qual maneira é melhor? JPA

Como posso em JPA fazer a persistência, por exemplo… quando vou gravar as informações, colocar as informações da classe Pessoa na tabela pessoa e a as informações da classe Endereco na tabela endereco,

mas a tabela pessoa tem uma chave estrangeira de endereco (id_endereco), queria gravasse primeiro o endereco e que quando o Endereco fosse gravado pegasse o id de endereco e gravasse em pessoa

Fiz o código abaixo e não deu certo

private EntityManagerFactory factory;
	
	private EntityManager manager;
factory = Persistence.createEntityManagerFactory("banco");
		manager = factory.createEntityManager();
		
		EntityTransaction tx = manager.getTransaction();
		tx.begin();
		try 
		{
			manager.persist(endereco);
			manager.persist(pessoaFisica);
			manager.flush();
			manager.clear();
			tx.commit();
		
		}
		catch (RuntimeException e) 
		{ 
			tx.rollback();
			manager.close();
			factory.close();
			
		}
		manager.close();
		factory.close();

dessa forma não foi, tenho que capturar na mão??? ou tem uma forma de fazer diretamente?

o que tem q ter nas minhas Classes-Entidades? ex: de como estão agora

@Entity
@Table(name = "pessoa_fisica")
public class PessoaFisica
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_pessoa_fisica", nullable = false)
	private Integer idPessoaFisica;
	
	@Column(nullable = false)
	private String nome;

        @OneToOne
	@JoinColumn(name = "id_endereco")
	private Endereco endereco;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Endereco
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_endereco", nullable = false)
	private Integer idEndereco;
	
	@Column(nullable = false)
	private String logradouro;
}
@Entity
@Table(name = "pessoa_juridica")
public class PessoaJuridica
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_pessoa_juridica", nullable = false)
	private Integer idPessoaJuridica;
	
	@Column(nullable = false)
	private String nome;
	
	private String cnpj;
}

Não leve em conta o a PessoaJuridica, porque creio que seja a mesma coisa de um para outro, o que eu alterar em um altero no outro.

Testa ai duas coisas:

manager.persist(endereco);
pessoaFisica.setEndereco(endereco)
manager.persist(pessoaFisica);
manager.flush();
tx.commit(); 

OU

manager.persist(pessoaFisica);
manager.flush();
tx.commit(); 

ajustando seu mapeamento assim:

@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "id_endereco")
private Endereco endereco; 

Não testei nenhuma das duas, inclusive a do cascade eu nunca usei :wink: não gosto muito da ideia de ele fazer automatico e eu não ver :stuck_out_tongue: por isso nem sei se funciona assim heheh