1
resposta

[Dúvida] Relação many to many

não entendi como o professor usou ManyToMany, pois ao meu ver, uma consulta pode ter somente um paciente e um médico, mas um medico e um paciente podem ter varias consultas. Inclusive, foi o erro que deu na minha aplicação: Caused by: org.hibernate.AnnotationException: Property 'rocha.andre.api.domain.appointment.Appointment.doctor' is not a collection and may not be a '@OneToMany', '@ManyToMany', or '@ElementCollection' at org.hibernate.cfg.annotations.CollectionBinder.determineSemanticJavaType(CollectionBinder.java:1044) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.CollectionBinder.determineCollectionClassification(CollectionBinder.java:946) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.CollectionBinder.createBinderAutomatically(CollectionBinder.java:768) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:761) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.CollectionBinder.bindCollection(CollectionBinder.java:287) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.AnnotationBinder.buildProperty(AnnotationBinder.java:1235) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1112) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.EntityBinder.processIdPropertiesIfNotAlready(EntityBinder.java:935) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.annotations.EntityBinder.bindEntityClass(EntityBinder.java:273) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:556) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final] at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:216) ~[hibernate-core-6.1.7.Final.jar:6.1.7.Final]

foi só trocar para OneToMany que voltou a compilar normalmente.

1 resposta

Olá,

A mensagem de erro que você está vendo, Property 'rocha.andre.api.domain.appointment.Appointment.doctor' is not a collection and may not be a '@OneToMany', '@ManyToMany', or '@ElementCollection', está indicando que o Hibernate não pode aplicar uma associação @ManyToMany à propriedade doctor na entidade Appointment porque o Hibernate espera que essa propriedade seja uma coleção, o que não é o caso.

No contexto que você descreveu, faz sentido que uma consulta tenha um único médico e um único paciente, o que sugere uma relação de muitos-para-um entre consultas e médicos, e também entre consultas e pacientes. Portanto, a alteração para @OneToMany é apropriada.

No entanto, se você quisesse usar uma associação @ManyToMany corretamente, seria em cenários onde uma consulta pode envolver vários médicos e/ou vários pacientes. Por exemplo, imagine uma situação em que uma consulta é uma discussão de caso clínico envolvendo vários médicos especialistas. Nesse caso, faria sentido ter uma associação @ManyToMany entre consultas e médicos, bem como entre consultas e pacientes.

Para resolver o problema atual, se o seu modelo de dados implica que uma consulta está relacionada a um único médico e a um único paciente, o uso de @OneToMany é o caminho correto, como você já fez. Certifique-se de que a estrutura do banco de dados e as classes de entidade estejam configuradas de acordo com essa relação de muitos-para-um.