web-dev-qa-db-fra.com

Mappage JPA @ManyToOne entre Embeddable et EmbeddedId

J'ai la configuration suivante dans mon application Spring Boot JPA:

intégrable

@Embeddable
public class LogSearchHistoryAttrPK {
    @Column(name = "SEARCH_HISTORY_ID")
    private Integer searchHistoryId;

    @Column(name = "ATTR", length = 50)
    private String attr;

    @ManyToOne
    @JoinColumn(name = "ID")
    private LogSearchHistory logSearchHistory;
    ...
}

EmbeddedId

@Repository
@Transactional
@Entity
@Table(name = "LOG_SEARCH_HISTORY_ATTR")
public class LogSearchHistoryAttr implements Serializable {
    @EmbeddedId
    private LogSearchHistoryAttrPK primaryKey;

    @Column(name = "VALUE", length = 100)
    private String value;
    ...
}

OneToMany

@Repository
@Transactional
@Entity
@Table(name = "LOG_SEARCH_HISTORY")
public class LogSearchHistory implements Serializable {
    @Id
    @Column(name = "ID", unique = true, nullable = false)
    private Integer id;

    @OneToMany(mappedBy = "logSearchHistory", fetch = FetchType.EAGER)
    private List<LogSearchHistoryAttr> logSearchHistoryAttrs;
    ...
}

DDL de base de données

CREATE TABLE log_search_history (
    id serial NOT NULL,
    ...
    CONSTRAINT log_search_history_pk PRIMARY KEY (id)
 );

CREATE TABLE log_search_history_attr (
    search_history_id INTEGER NOT NULL,
    attr CHARACTER VARYING(50) NOT NULL,
    value CHARACTER VARYING(100),
    CONSTRAINT log_search_history_attr_pk PRIMARY KEY (search_history_id, attr),
    CONSTRAINT log_search_history_attr_fk1 FOREIGN KEY (search_history_id) REFERENCES
        log_search_history (id)
);

Lorsque je vais démarrer l'application, j'obtiens l'erreur suivante:

Provoqué par: org.hibernate.AnnotationException: mappedBy référence une propriété d'entité cible inconnue: com.foobar.entity.LogSearchHistoryAttr.logSearchHistory dans com.foobar.entity.LogSearchHistory.logSearchHistoryAttrs

Je ne sais pas pourquoi j'obtiens cette erreur - le mappage semble correct (pour moi). Quel est le problème avec cette cartographie que j'ai? Merci!

15
Ascalonian

Vous avez déplacé l'attribut mappedBy dans une clé primaire intégrable, donc le champ n'est plus nommé logSearchHistory mais plutôt primaryKey.logSearchHistory. Modifiez votre mappé par entrée:

@OneToMany(mappedBy = "primaryKey.logSearchHistory", fetch = FetchType.EAGER)
private List<LogSearchHistoryAttr> logSearchHistoryAttrs;

Référence: Mappage JPA/Hibernate OneToMany, utilisant une clé primaire composite .

Vous devez également rendre la classe de clé primaire LogSearchHistoryAttrPK sérialisable.

14
K.Nicholas

À OneToMany partie:

@OneToMany(mappedBy = "primaryKey.logSearchHistory", fetch = FetchType.EAGER)
private List<LogSearchHistoryAttr> logSearchHistoryAttrs;
2
lukaszwrzaszcz