Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免由于无法使用多重继承而导致代码重复。冬眠_Java_Spring_Hibernate_Multiple Inheritance - Fatal编程技术网

Java 如何避免由于无法使用多重继承而导致代码重复。冬眠

Java 如何避免由于无法使用多重继承而导致代码重复。冬眠,java,spring,hibernate,multiple-inheritance,Java,Spring,Hibernate,Multiple Inheritance,我正在开发一个Spring-Hibernate应用程序,我有一个关于如何正确避免重复代码和使用Hibernate的问题,因为不可能使用多重继承(我通常使用Python,所以这不是一个“问题”) 我的UML: 例如,我的类Periodico对Livro或Prototexto也有相同的扩展GenericEntity: @Entity @Table(name = "periodico") public class Periodico extends GenericEntity { } 我的问题是

我正在开发一个Spring-Hibernate应用程序,我有一个关于如何正确避免重复代码和使用Hibernate的问题,因为不可能使用多重继承(我通常使用Python,所以这不是一个“问题”)

我的UML:

例如,我的类Periodico对Livro或Prototexto也有相同的扩展GenericEntity:

@Entity
@Table(name = "periodico")
public class Periodico extends GenericEntity {

}
我的问题是:?在两个类的情况下,实现继承的方法是什么

此时此刻,我正在做这件事,它起作用了。但是我在每个类中复制了一些代码(Produçao activa)

/**
 * Created by hlorenzo on 03/08/2017.
 */
@Entity
@Table(name = "prototexto")
public class Prototexto extends GenericEntity {


    private String titulo;

    /*
     Código alfanumérico composto por nº de clase + tipo (3 iniciais) + nº Id (3 cifras) + data_ano
    */
    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "numerasao")
    private String numerasao;

    /*
     La utilización del prefijo nacimiento es para que funcione con el componente fecha.component.js de forma automática.
     */
    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "publicacion_dia")
    private Integer nacimientoDia;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "publicacion_mes")
    private Integer nacimientoMes;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "publicacion_ano")
    private Integer nacimientoAno;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "primeira_linha")
    private String primeiraLinha;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "ultima_linha")
    private String ultimaLinha;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "numero_paginas")
    private Long numeroPaginas;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "descrisao")
    private String descrisao;

    @JsonView(JsonViews.DetailedList.class)
    @Column(name = "localizasao")
    private String localizasao;

    @Enumerated(value = EnumType.STRING)
    private TipoPrototexto tipo;


    private boolean revisado;

    private boolean concluido;

    @JsonView(JsonViews.DetailedList.class)
    @ManyToOne
    @JoinColumn(name="pais_id")
    private Pais pais;


    @JsonView(JsonViews.DetailedList.class)
    @ManyToOne
    @JoinColumn(name="ciudad_id")
    private Ciudad ciudad;
[...]
}
和我的一般实体:

@MappedSuperclass
public abstract class GenericEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonView(JsonViews.List.class)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}

非常感谢。

在许多情况下,如果您可以使用来自多个父类的继承,那么您应该使用接口(如果您需要在子类中编写自己的实现,并且只想声明您与这些接口兼容),或者使用聚合(如果您不需要覆盖任何内容,只需要重复使用一些代码,聚合通常会更加灵活)

因此,您可以扩展GenericEntity和聚合Publicada,而不是扩展GenericEntity和Publicada

如果将其存储到数据库中,ORM映射器无论如何都会将继承“转换”为聚合,因此,如果您首先使用聚合,而不是让hibernate将继承转换为聚合,以便将其存储到数据库中,那么对您的大脑来说,无论如何都要容易得多


如果你读过关于设计模式的书(有很多关于它的书,比如“heads up design pattern”第一章->第13页或google for aggregation over Inheritation或,您可以看到为什么聚合通常比继承有很多优势,以及为什么他们决定在java中不允许从多个类继承。

在许多情况下,您可以使用从多个父类继承,而应该使用其中一个接口(如果您需要在子类中编写自己的实现,并且只想声明您与接口兼容)或使用聚合(如果您不需要覆盖任何内容,只想重用一些代码,那么聚合通常更灵活)

因此,您可以扩展GenericEntity和聚合Publicada,而不是扩展GenericEntity和Publicada

如果将其存储到数据库中,ORM映射器无论如何都会将继承“转换”为聚合,因此,如果您首先使用聚合,而不是让hibernate将继承转换为聚合,以便将其存储到数据库中,那么对您的大脑来说,无论如何都要容易得多


如果你读过关于设计模式的书(有很多关于它的书,比如“heads up design pattern”第一章->第13页或google for aggregation over Inheritation或,您可以看到为什么聚合通常比继承有很多优势,以及为什么他们决定在java中不允许从多个类继承。

什么意思?java不支持多重继承。谢谢@SachinSarawgi。我知道,我只是试图减少重复代码。可能是创建一个接口。我认为重复变量不是正确的实现方法。所以…如果Java不支持多重继承,我应该复制代码,还是可以使用其他方法。这就是重点。再次感谢。没有“正确”的说法这与JPA API无关,JPA API只是将您定义的类持久化,以供查看。这个问题更适合这里。交叉发布您的意思是什么?Java不支持多重继承。谢谢@SachinSarawgi。我知道,我只是试图减少重复代码。可能创建一个接口。我认为duplicate变量不是实现这一点的正确方法。因此……如果Java不支持多重继承,我应该复制代码,还是可以使用其他方法。这就是重点。再次感谢。没有“正确”的说法这与JPA API无关,JPA API只是将您定义的类持久化以供查看。这个问题更适合这里。交叉发布我的问题不是如何避免java中的重复代码,而是如何避免使用Hibernate的代码。我知道我可以使用agregation或接口,但例如,如果我使用agrega此外,我需要在数据库中创建一个新表。与paise或Ciudades类似:
@JsonView(JsonViews.DetailedList.class)@manytone@JoinColumn(name=“pais_id”)
private Pais Pais;非常感谢@flack。正如我所写,Hibernate继承确实是可能的,但它没有任何好处,只会伤害你的大脑。我不知道你是使用代码优先还是数据库优先的方法,但如果你使用代码优先的方法并让Hibernate生成你的表,你可以选择hiberna的方式te应该处理继承。您可以选择两个选项hibernate处理继承的方式:-它为所有存在的子类的1000个字段中的每个字段生成一个大表,并为类名增加一列-或者它将继承转换为聚合。如果您让hibernate将继承转换为聚合首先,它将为每个类生成一个表,不管它是否是抽象类。放入子类的行将在子类表中得到一行,在抽象顶级类表中得到一行。子类表将聚合顶级类表。因此,这与直接使用聚合完全相同你自己,只要你直接使用聚合,那么你就有很多其他的好处,也就没有那么麻烦了。我的问题不是如何避免java中的重复代码,而是如何避免使用Hibernate。我知道我可以使用agregation或接口,但举个例子,如果我使用agregation,我需要在我的DB中创建一个新表。比如Paise或Ciudades:
@JsonView(JsonViews.DetailedList.class)@ManyToOne@JoinColumn(name=“pais\u id”)
private pais pais;谢谢