Я однажды сражался с @EmbeddedId
, и я достиг той же цели с @IdClass
.Разница в том, что когда вы используете @IdClass
, вы не используете его в определении класса, но вы переопределяете те же поля (однако у меня есть прямые методы получения / установки для полей идентификаторов, что для меня более удобно).
Вот мой пример из проекта, который я использую для обработки свободно доступной базы данных адресов польского государственного учреждения GUS:
Составной ключ:
@Embeddable
class GusPowiatPK implements Serializable {
private static final long serialVersionUID = 1L;
private Short powiatNr;
private GusWojewodztwo wojewodztwo;
@Column(name = "POW_NR")
public Short getPowiatNr() {
return powiatNr;
}
public void setPowiatNr(Short powiatNr) {
this.powiatNr = powiatNr;
}
@ManyToOne
@JoinColumn(name = "WOJ_ID")
public GusWojewodztwo getWojewodztwo() {
return wojewodztwo;
}
public void setWojewodztwo(GusWojewodztwo wojewodztwo) {
this.wojewodztwo = wojewodztwo;
}
}
Класс, использующий его (округ):
@Entity
@Table(name = "POWIAT")
@IdClass(GusPowiatPK.class)
public class GusPowiat {
private Short powiatNr;
private GusWojewodztwo wojewodztwo;
private String nazwa;
private Date stanNa;
private boolean powiatMiejski;
public GusPowiat() {
super();
}
public GusPowiat(Short powiatNr, GusWojewodztwo wojewodztwo) {
super();
this.powiatNr = powiatNr;
this.wojewodztwo = wojewodztwo;
}
@Id
public Short getPowiatNr() {
return powiatNr;
}
public void setPowiatNr(Short powiatNr) {
this.powiatNr = powiatNr;
}
@Id
public GusWojewodztwo getWojewodztwo() {
return wojewodztwo;
}
public void setWojewodztwo(GusWojewodztwo wojewodztwo) {
this.wojewodztwo = wojewodztwo;
}
@Column(name = "NAZWA", length = 50, nullable = false)
public String getNazwa() {
return nazwa;
}
public void setNazwa(String nazwa) {
this.nazwa = nazwa;
}
@Temporal(TemporalType.DATE)
@Column(name = "STAN_NA", nullable = false)
public Date getStanNa() {
return stanNa;
}
public void setStanNa(Date stanNa) {
this.stanNa = stanNa;
}
@Column(name = "POW_MIEJSKI")
public boolean isPowiatMiejski() {
return powiatMiejski;
}
public void setPowiatMiejski(boolean powiatMiejski) {
this.powiatMiejski = powiatMiejski;
}
}
Класс, составляющий составной ключ (провинция):
@Entity
@Table(name = "WOJEWODZTWO")
public class GusWojewodztwo {
private Short id;
private String nazwa;
private Date stanNa;
public GusWojewodztwo() {
super();
}
public GusWojewodztwo(Short id) {
super();
this.id = id;
}
@Id
@Column(name = "WOJ_ID")
public Short getId() {
return id;
}
public void setId(Short id) {
this.id = id;
}
@Column(name = "NAZWA", length = 50, nullable = false)
public String getNazwa() {
return nazwa;
}
public void setNazwa(String nazwa) {
this.nazwa = nazwa;
}
@Temporal(TemporalType.DATE)
@Column(name = "STAN_NA", nullable = false)
public Date getStanNa() {
return stanNa;
}
public void setStanNa(Date stanNa) {
this.stanNa = stanNa;
}
}