私は次のエンティティを持っています:
@Embeddable
public class Noticia_i18nPK implements Serializable {
private static final long serialVersionUID = 4556976991711237055L;
private Noticia noticia;
private String codigoIdioma;
public Noticia_i18nPK() {}
public Noticia_i18nPK (Noticia noticia, String codigoIdioma) {
this.noticia = noticia;
this.codigoIdioma = codigoIdioma;
}
@ManyToOne
@JoinColumn(name="noticia_id")
@NotNull
public Noticia getNoticia() {
return noticia;
}
public void setNoticia (Noticia noticia) {
this.noticia = noticia;
}
@Column(name = "codigoidioma")
@NotNull
public String getCodigoIdioma() {
return codigoIdioma;
}
public void setCodigoIdioma (String codigoIdioma) {
this.codigoIdioma = codigoIdioma;
}
@Override
public int hashCode() {
int result = 31;
result += (codigoIdioma == null) ? 0 : codigoIdioma.hashCode();
result += (noticia == null) ? 0 : noticia.getId().intValue();
return result;
}
@Override
public boolean equals (Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass())
return false;
Noticia_i18nPK other = (Noticia_i18nPK) obj;
if (codigoIdioma == null) {
if (other.getCodigoIdioma() != null)
return false;
} else if (!codigoIdioma.equals (other.getCodigoIdioma()))
return false;
if (noticia == null) {
if (other.getNoticia() != null)
return false;
} else if (noticia.getId().compareTo (other.getNoticia().getId()) != 0)
return false;
return true;
}
}
国際化POJO:
@Entity
@Table(name = "Noticia_i18n")
public class Noticia_i18n implements Serializable {
private static final long serialVersionUID = 9093075808608249854L;
private Noticia_i18nPK noticia_i18nPK;
private String descripcion;
@EmbeddedId
public Noticia_i18nPK getNoticia_i18nPK() {
return noticia_i18nPK;
}
public void setNoticia_i18nPK (Noticia_i18nPK noticia_i18nPK) {
this.noticia_i18nPK = noticia_i18nPK;
}
@Column(name="descripcion")
@Length(max=5000)
@NotNull
public String getDescripcion() {
return descripcion;
}
public void setDescripcion (String descripcion) {
this.descripcion = descripcion;
}
@Override
public int hashCode() {
return noticia_i18nPK.hashCode();
}
@Override
public boolean equals (Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass())
return false;
Noticia_i18n other = (Noticia_i18n) obj;
if (noticia_i18nPK == null) {
if (other.getNoticia_i18nPK() != null)
return false;
} else if (!noticia_i18nPK.equals (other.getNoticia_i18nPK()))
return false;
return true;
}
}
そしてPOJO:
@Entity
@Table(name="noticia")
@SequenceGenerator(
name = "noticia_id_seq",
sequenceName = "ef.noticia_id_seq",
allocationSize=1)
public class Noticia extends AuctionsBaseEntity {
private static final long serialVersionUID = -5402495697859251461L;
private Long id;
private Date fecha;
private Set<Noticia_i18n> noticia_i18n;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "noticia_id_seq")
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Date getFecha() {
return fecha;
}
public void setFecha(Date fecha) {
this.fecha = fecha;
}
@JoinColumn(name="noticia_id")
@OneToMany(cascade={CascadeType.ALL})
public Set<Noticia_i18n> getNoticia_i18n() {
return noticia_i18n;
}
public Noticia_i18n getNoticia_i18n (String codigoIdioma) {
getNoticia_i18n();
if (!VacioHelper.esVacio (this.noticia_i18n)) {
for (Noticia_i18n i18nActual : this.noticia_i18n) {
if ((i18nActual.getNoticia_i18nPK() != null) &&
(i18nActual.getNoticia_i18nPK().getCodigoIdioma().compareTo (codigoIdioma) == 0))
return i18nActual;
}
}
return null;
}
public void setNoticia_i18n (Set<Noticia_i18n> noticia_i18n) {
this.noticia_i18n = noticia_i18n;
}
public void addNoticia_i18n (Noticia_i18n noticia_i18n) {
if (noticia_i18n != null) {
if (this.noticia_i18n == null)
this.noticia_i18n = new HashSet<Noticia_i18n>();
noticia_i18n.getNoticia_i18nPK().setNoticia (this);
this.noticia_i18n.add (noticia_i18n);
}
}
}
問題は、noticia_i18n要素を削除するにはどうすればよいですか?たとえば、3つのnoticia_i18n要素を持つnoticiaを取得した場合、次のようになります。
EntityManager em;
....
noticia = DaoFactory.getDefault().getNoticiaDao().findById (em, noticiaActual.getIdNoticia());
...
noticia_i18nエンティティを削除しようとすると:
Noticia_i18n traduccionNoticia = noticia.getNoticia_i18n (noticiaActual.getCodigoIdioma());
DaoFactory.getDefault().getNoticia_i18nDao().remove (em, traduccionNoticia);
エラーが発生します:
deleted entity passed to persist Noticia_i18n#<null>
しかし、(削除する前に)コードを追加した場合:
noticia.getNoticia_i18n().remove (traduccionNoticia);
Hibernateがnoticia_i18nをnoticia_idのnull値で更新しようとするため、エラーは更新にあります。
問題は、このコレクションの要素を削除する方法です。クラスのマッピングにはどのような変更が必要ですか?