簡體   English   中英

鍵是類時的組合鍵

[英]Composite Key when a key is a class

我正在嘗試在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
}
  • 添加@ManyToOne映射到與Restaurante關系

    @Id @ManyToOne @JoinColumn(name="idRestaurante") private Restaurante restaurante;

ImagemRestaurante實例的存在取決於Restaurante實例的存在。 這就是為什么JPA規范將Restaurante稱為ImagemRestaurante的對象

如果實體中的Id屬性與父實體存在多對一或一對一關系,則id類中的對應屬性必須與父類的id類或嵌入式id具有相同的Java類型實體(如果父實體具有組合主鍵)或父實體的Id屬性的類型(如果父實體具有簡單主鍵)。

  • 更改private Restaurante restaurante; private Long restaurante; ImagemRestauranteId類中。 作為IdClass的ImagemRestauranteId必須僅保留對Restaurante的PK引用。 JPA規范中的以下詞語適用

簡單主鍵或復合主鍵的字段或屬性應為以下類型之一:任何Java原語類型; 任何原始包裝器類型; java.lang.String中; java.util.Date; java.sql.Date; java.math.BigDecimal的; java.math.BigInteger

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM