【发布时间】:2013-11-03 12:48:23
【问题描述】:
我正在使用 Hibernate 制作模型类,但我不知道如何处理这种关系。
我有三张桌子。
地址、员工和个人。
一个员工可以有一个地址,一个人可以有一个地址。
我不知道如何映射。
因为我想使用嵌入式注释但不起作用。
首先是映射我的类,我需要把这两个实体放在地址类中吗?
我需要使用什么样的注释?
我使用具有 id 属性的超类,并且每个类都扩展。
我正在使用 mysql
我的个人类
@Entity
@Table(name = "destinatario")
public class Destinatario extends Persistent {
private static final long serialVersionUID = -7091318100871934315L;
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "endereco_id", referencedColumnName = "id")
private Endereco endereco;
@NotNull
@Size(max = 60)
@Column(name = "razao_social")
private String razaoSocial;
@NotNull
@Size(max = 14)
@Column(name = "inscricao_estadual")
private String inscricaoEstadual;
@Size(max = 9)
@Column(name = "inscricao_suframa")
private String inscricaoSuframa;
@Size(max = 60)
@Column(name = "email")
private String email;
@Size(max = 14)
@Column(name = "cnpj")
private String cnpj;
@Size(max = 11)
@Column(name = "cpf")
private String cpf;
@OneToMany
@JoinColumn(name = "destinatario_id")
private List<NotaFiscal> notaFiscais;
}
我的地址类别
@Entity
@Table(name = "endereco")
public class Endereco extends Persistent {
private static final long serialVersionUID = -3308931308130690090L;
public enum UF {
AC("AC", "Acre"),
AL("AL", "Alagoas"),
AP("AP", "Amapá"),
AM("AM", "Amazonas"),
BA("BA", "Bahia"),
CE("CE", "Ceara"),
DF("DF", "Distrito Federal"),
ES("ES", "Espirito Santo"),
GO("GO", "Goiás"),
MA("MA", "Maranhão"),
MT("MT", "Mato Grosso"),
MS("MS", "Mato Grosso do Sul"),
MG("MG", "Minas Gerais"),
PA("PA", "Pará"),
PB("PB", "Paraíba"),
PR("PR", "Paraná"),
PE("PE", "Pernambuco"),
PI("PI", "Piauí"),
RJ("RJ", "Rio de Janeiro"),
RN("RN", "Rio Grande do Norte"),
RS("RS", "Rio Grande do Sul"),
RO("RO", "Rondônia"),
RR("RR", "Roraima"),
SC("SC", "Santa Catarina"),
SP("SP", "São Paulo"),
SE("SE", "Sergipe"),
TO("TO", "Tocantins");
private final String index;
private String descricao;
private UF(String index, String descricao) {
this.index = index;
this.descricao = descricao;
}
public String getNomeEstado() {
return descricao;
}
public String getIndex() {
return index;
}
}
@NotNull
@Size(max = 60)
@Column(name = "logradouro", unique = true)
private String logradouro;
@NotNull
@Size(max = 60)
@Column(name = "numero", unique = true)
private String numero;
@Size(max = 60)
@Column(name = "complemento")
private String complemento;
@NotNull
@Size(max = 60)
@Column(name = "bairro", unique = true)
private String bairro;
@NotNull
@Size(max = 60)
@Column(name = "municipio", unique = true)
private String municipio;
@Enumerated(EnumType.STRING)
@NotNull
//@Type(type = UFType.TYPE)
@Column(name = "uf", columnDefinition = "varchar", length = 2)
private UF uf;
@NotNull
@Size(max = 8)
@Column(name = "cep", unique = true)
private String cep;
@Size(max = 14)
@Column(name = "telefone")
private String telefone;
}
我通过xml源运行和创建人的方法
public static void main(String[] args) {
new Processadora().extrairDadosXml("diego");
ArquivoNotaFiscal arquivoNotaFiscal = null;
Destinatario destinatario = null;
NotaFiscal notaFiscal = null;
destinatario = createDestinatario();
arquivoNotaFiscal = createArquivoNotaFiscal();
notaFiscal = createNotaFiscal(arquivoNotaFiscal, emitente, destinatario);
destinatario.setNotaFiscais(Arrays.asList(notaFiscal));
DestinatarioDAO<Destinatario> destinatarioDAO = new DestinatarioDAOImpl<>();
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.getTransaction();
transaction.begin();
destinatarioDAO.save(destinatario);
transaction.commit();
}
private static Destinatario createDestinatario() {
Destinatario destinatario = new Destinatario();
Endereco endereco = new Endereco();
endereco.setLogradouro(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getLogradouro());
endereco.setNumero(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getNumero());
endereco.setBairro(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getBairro());
endereco.setComplemento(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getComplemento());
endereco.setCep(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getCep());
endereco.setMunicipio(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getMunicipio());
endereco.setUf(UF.valueOf(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getUF()));
endereco.setTelefone(nFeProc.getNfe().getInfNFe().getDestinatario().getEndereco().getTelefone());
destinatario.setEndereco(endereco);
destinatario.setRazaoSocial(nFeProc.getNfe().getInfNFe().getDestinatario().getRazaoSocial());
destinatario.setInscricaoEstadual(nFeProc.getNfe().getInfNFe().getDestinatario().getInscricaoEstadual());
destinatario.setInscricaoSuframa(nFeProc.getNfe().getInfNFe().getDestinatario().getInscricaoSuframa());
destinatario.setEmail(nFeProc.getNfe().getInfNFe().getDestinatario().getEmail());
destinatario.setCnpj(nFeProc.getNfe().getInfNFe().getDestinatario().getCnpj());
destinatario.setCpf(nFeProc.getNfe().getInfNFe().getDestinatario().getCpf());
return destinatario;
}
我的数据库有外键约束,我用的是 mysql
【问题讨论】:
-
这完全取决于表链接在一起的方式。地址内部或员工和人员内部是否有外键?
-
我在表 person 和 employee 中有外键
-
好的,所以你有三个实体。你有一个从人到地址的 OneToOne,使用 JoinColumn。和从 Employee 到 Address 的类似 OneToOne,也使用 JoinColumn。阅读 hibernate 文档,尝试编写一些代码,如果它不起作用,请使用您的代码返回。
-
您不必识别关联是单向的还是双向的。这是你必须做的选择。您可以将关联映射为从 Person 到 Address 的单向 ManyToOne,或从 Address 到 person 的单向 OneToMany,或作为双向 OneToMany/ManyToOne。这完全取决于你。在这种情况下,我可能会选择单向多对一选项。