Я бы хотел создать промежуточную таблицу для отношения @ManyToMany с дополнительным столбцом.На данный момент я использую базу данных H2, MariaDB / MySQL планируется, когда выйдет в эфир.У меня есть классы:
UserEntity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class UserEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@OneToMany(mappedBy = "userEntity",
cascade = CascadeType.ALL,
orphanRemoval = true)
private Set<VoteEntity> votedRoutes = new HashSet<>();
}
RouteEntity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class RouteEntity {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
...
@OneToMany(mappedBy = "routeEntity",
cascade = CascadeType.ALL,
orphanRemoval = true)
private Set<VoteEntity> votedUsers = new HashSet<>();
}
, и у меня есть VoteEntity чтобы держать их вместе:
@Data
@NoArgsConstructor
@Entity
public class VoteEntity {
@EmbeddedId
private VoteEntityID id;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
private UserEntity userEntity;
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("routeId")
private RouteEntity routeEntity;
//... additional stuff
}
и встраиваемый класс VoteEntityID для идентификатора:
@Embeddable
@Data
@NoArgsConstructor
public class VoteEntityID implements Serializable {
private UUID userId;
private UUID routeId;
}
Я пытаюсь добавить голос от UserServiceс методом
public void addVote(String userEmail, Route route) {
UserEntity userEntity = findByEmail(userEmail);
RouteEntity routeEntity = routeService.map(route);
VoteEntity voteEntity = new VoteEntity();
voteEntity.setUserEntity(userEntity);
voteEntity.setRouteEntity(routeEntity);
userEntity.getVotedRoutes().add(voteEntity);
routeEntity.getVotedUsers().add(voteEntity);
userRepository.save(userEntity);
routeService.save(routeEntity);
}
каждый раз, когда я пытаюсь создать идентификатор, я получаю сообщение об ошибке:
Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] threwисключение
[Ошибка обработки запроса;вложенное исключение - org.springframework.orm.jpa.JpaSystemException: не удалось установить значение поля [ff5ea4d4-1834-45e6-b30d-beec2b376a42] с помощью отражения:
[class package.VoteEntityID.routeId] setter package.VoteEntity.routeId;вложенное исключение: org.hibernate.PropertyAccessException: не удалось установить значение поля [ff5ea4d4-1834-45e6-b30d-beec2b376a42] с помощью отражения: [class package.VoteEntityID.routeId] установщик package.VoteEntityID.routeId] с коренной причиной j.lang.NullPointerException: ноль в java.base / jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj (UnsafeFieldAccessorImpl.java:57) ~ [na: na] ... ...
я действительно могуне могу понять :( Я использую аннотацию @Data Lombok, в которой есть @Setter. Любая идея, почему передается значение null, чтобы обеспечитьObj?