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!
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.
À OneToMany partie:
@OneToMany(mappedBy = "primaryKey.logSearchHistory", fetch = FetchType.EAGER)
private List<LogSearchHistoryAttr> logSearchHistoryAttrs;