Я могу воссоздать ваше исключение, смешав сопоставление аннотаций между полями и свойствами.Я вижу в проблеме, которую вы описали выше, вы аннотируете поле Id, но затем комментируете свойство userRole, если я делаю то же самое, я получаю ту же ошибку.Я могу исправить ошибку, пометив только свойства или поля.Обе эти модели работают:
@Entity
@Table(name = "USER")
public class User {
private Long id;
private UserRole userRole;
String userName;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "USER_NAME")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@ManyToOne()
@JoinColumn(name="role_id")
public UserRole getUserRole() {
return userRole;
}
public void setUserRole(UserRole userRole) {
this.userRole = userRole;
}
}
Это также работает:
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne()
@JoinColumn(name="role_id")
private UserRole userRole;
@Column(name = "USER_NAME")
String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserRole getUserRole() {
return userRole;
}
public void setUserRole(UserRole userRole) {
this.userRole = userRole;
}
}
Пример другого объекта модели, аннотирующего поля
@Entity
@Table(name = "USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne()
@JoinColumn(name="role_id")
private UserRole userRole;
@Column(name = "USER_NAME")
String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserRole getUserRole() {
return userRole;
}
public void setUserRole(UserRole userRole) {
this.userRole = userRole;
}
}
Тестовый код (я добавилэто потому, что часто возникает путаница, что необходимо установить двунаправленное отношение, чтобы и пользователи, и userRole сохраняли свои данные с сохранением в UserRole).
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setUserName("user1");
users.add(user1);
User user2 = new User();
user2.setUserName("user2");
users.add(user2);
UserRole userRole = new UserRole();
userRole.setRoleName("admin");
//Unidirectional relationship
user1.setUserRole(userRole);
user2.setUserRole(userRole);
//set Bidirectional relationship
userRole.setUsers(users);
userRole = userRoleRepository.save(userRole);
//Show that the two users and the UserRole persisted
UserRole result = userRoleRepository.findById(userRole.getId()).get();
assertEquals(2, result.getUsers().size());