密钥是类时的复合密钥

时间:2014-08-13 02:47:01

标签: java jpa

我正在尝试在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
}

1 个答案:

答案 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中