gpt4 book ai didi

java - 如何避免由于无法使用多重继承而导致重复代码。 hibernate

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:11 26 4
gpt4 key购买 nike

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

我的 UML:

/image/LdEwf.png

例如,我的类(class),Periodicico,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;
[...]
}

还有我的 GenericEntity:

@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;
}

}

非常感谢。

最佳答案

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

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

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

如果你读过有关设计模式的书(有很多关于它的书,比如“抬头设计模式”第一章 https://www.google.com/?q=head+first+design+patterns+pdf -> 第 13 页,或者通过 google 搜索关于继承的聚合 Inheritance vs. Aggregationhttps://en.wikipedia.org/wiki/Composition_over_inheritance ),你就会明白为什么聚合通常比继承有很多优势,以及为什么他们决定禁止从 java 中的多个类继承。

关于java - 如何避免由于无法使用多重继承而导致重复代码。 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45669605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com