Estoy desarrollando una aplicación de escritorio Java y utilizando JPA para la persistencia. Tengo un problema mencionado a continuación:JPA - Problema de diseño de entidad
Tengo dos entidades:
- País
- Ciudad
país tiene el atributo siguiente:
- CountryName (PK)
City tiene el atributo siguiente:
- CityName
Ahora bien, como no puede haber dos ciudades con el mismo nombre en dos países diferentes, la primaryKey para la mesa de la ciudad en el datbase es una clave principal compuesta formada de CityName
y CountryName
.
Ahora mi pregunta es ¿Cómo poner en práctica la clave principal de la
City
comoEntity
en Java
@Entity
public class Country implements Serializable {
private String countryName;
@Id
public String getCountryName() {
return this.countryName;
}
}
@Entity
public class City implements Serializable {
private CityPK cityPK;
private Country country;
@EmbeddedId
public CityPK getCityPK() {
return this.cityPK;
}
}
@Embeddable
public class CityPK implements Serializable {
public String cityName;
public String countryName;
}
Ahora que sabemos que la relación desde Country
a City
es OneToMany
y para mostrar esta relación en el código anterior, he agregado una variable country
en la clase City
.
Pero entonces tenemos datos duplicados (countryName
) almacenados en dos lugares en el objeto City
clase: uno en el objeto country
y otra en el objeto cityPK
.
Pero, por otro lado, ambos son necesarios:
countryName
encityPK
objeto es necesario porque ponemos en práctica las claves primarias compuestas de esta manera.countryName
encountry
objeto es necesario porque es la forma estándar de mostrar la relación entre los objetos.
¿Cómo evitar este problema?
¿Es esta una forma estándar de tratar este tipo de problema? ¿Este problema es común en JPA? –
@Yatendra: Sí, es una forma estándar (si no usas claves sustitutivas, como sugiere Peter). – axtavt