我正在尝试在JPA上创建一个复合键,其中一个键是一个类,另一个是枚举。
但它出现以下错误:
Caused by: org.hibernate.MappingException: Could not determine type for: br.com.model.Restaurante, at table: ImagemRestaurante, for columns: [org.hibernate.mapping.Column(restaurante)]
ImagemRestaurante.java
@Entity
@IdClass(ImagemRestauranteId.class)
public class ImagemRestaurante implements Serializable {
private static final long serialVersionUID = -4650712996667906167L;
@Id
@JoinColumn(name="idRestaurante")
private Restaurante restaurante;
@Id
@Enumerated(EnumType.ORDINAL)
private TipoImagemRestaurante tipoImagemRestaurante;
private String nome;
private String formato;
private Long tamanho;
private Integer altura;
private Integer largura;
@Transient
private String caminho;
@Transient
private String caminhoHTML;
public ImagemRestaurante() {
}
// Get Sets
}
ImagemRestauranteId.java
public class ImagemRestauranteId implements Serializable {
private static final long serialVersionUID = -6216145537667024048L;
private Restaurante restaurante;
private TipoImagemRestaurante tipoImagemRestaurante;
public ImagemRestauranteId() {
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if ( ! (obj instanceof ImagemRestauranteId ) ) {
return false;
}
ImagemRestauranteId imaId = (ImagemRestauranteId) obj;
return (imaId.restaurante == restaurante) &&
(imaId.tipoImagemRestaurante == tipoImagemRestaurante);
}
@Override
public int hashCode() {
return restaurante.hashCode() + tipoImagemRestaurante.hashCode();
}
// Get Sets
}
Restaurante.java
@Entity
public class Restaurante {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long idRestaurante;
private String nmRestaurante;
private String dsRestaurante;
@OneToOne
private Telefone telefone;
@OneToOne
private Endereco endereco;
private Boolean permitirComentario;
private Boolean permitirNota;
@ManyToOne
private Usuario usuario;
public Restaurante() {
}
// Get Sets
}
答案 0 :(得分:1)
将@ManyToOne
映射添加到与Restaurante
的关系
@Id
@ManyToOne
@JoinColumn(name="idRestaurante")
private Restaurante restaurante;
ImagemRestaurante实例的存在取决于Restaurante实例的存在。这就是为什么Restaurante被JPA规范称为 parent 与ImagemRestaurante相关的原因
如果实体中的Id属性是与父级的多对一或一对一关系 实体,id类中的相应属性必须与Java类型相同 父类实体的id类或嵌入式id(如果父实体具有复合主体) key)或父实体的Id属性的类型(如果父实体具有 简单的主键)。
private Restaurante restaurante;
课程中将private Long restaurante;
更改为ImagemRestauranteId
。作为IdClass的ImagemRestauranteId必须仅保留对Restaurante的PK引用。以下来自JPA spec apply的话复合主键的简单主键或字段或属性应为以下之一 types:任何Java原始类型;任何原始包装类型; java.lang.String中; java.util.Date; java.sql.Date; java.math.BigDecimal的; java.math.BigInteger中