【问题标题】:Mapping this relationship with 2 entities using the same entity将此关系映射到使用同一实体的 2 个实体
【发布时间】: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

【问题讨论】:

  • 这完全取决于表链接在一起的方式。地址内部或员工和人员内部是否有外键?
  • 您可以阅读一些以前的文章以获得更多想法:article1article2。另见休眠文档here
  • 我在表 person 和 employee 中有外键
  • 好的,所以你有三个实体。你有一个从人到地址的 OneToOne,使用 JoinColumn。和从 Employee 到 Address 的类似 OneToOne,也使用 JoinColumn。阅读 hibernate 文档,尝试编写一些代码,如果它不起作用,请使用您的代码返回。
  • 您不必识别关联是单向的还是双向的。这是必须做的选择。您可以将关联映射为从 Person 到 Address 的单向 ManyToOne,或从 Address 到 person 的单向 OneToMany,或作为双向 OneToMany/ManyToOne。这完全取决于你。在这种情况下,我可能会选择单向多对一选项。

标签: mysql hibernate jpa


【解决方案1】:

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

所以这样一切正常。

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多