使用同一实体将此关系映射到2个实体

时间:2013-11-03 12:48:24

标签: mysql hibernate jpa

我正在使用Hibernate创建模型类,但我不知道如何处理这种关系。

我有三张桌子。

Adrress,员工和个人。

一个雇员可以有一个地址,一个人可以有一个地址。

我不知道地图如何。

因为我认为使用嵌入式注释但不起作用。

首先是映射我的类,我需要将这两个实体放在地址类中吗?

我需要使用什么样的注释?

我使用带有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

1 个答案:

答案 0 :(得分:0)

我发现了我的问题,我只保存了一个对象,因为我想如果我使用保存包含其他会保存的对象,但我需要在保存地址之后再保存这个人。

所以这种方式很有效。