我正在研究一个项目,我遇到了JPA关系的问题。我被告知另一个线程要改变一些事情,但是,我仍然无法让它正常工作。
我遇到了异常,我知道问题出在哪里,但不知道如何解决。
这是User类:
@Entity
@Table(name = "user")
public class UserModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "password", length = 500, nullable = false)
private String password;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Car> cars;
}
这是Car类:
@Entity
@Table(name = "car")
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(length = 11)
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "make", nullable = false)
private String make;
@Column(name = "model", nullable = false)
private String model;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "id") //here is where the exception throws (duplicated ID or com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'user_model_id' in 'field list' if I change that to user_model_id.
private UserModel userModel;
}
这是服务impl:
@Component
@Transactional(readOnly = true)
public class CarServiceImpl implements CarService {
@Inject
private CarRepository carRepository;
@Inject
private UserRepository userRepository;
@Override
@Transactional(readOnly = false)
public Car addCar(Long userId, Car car) {
User user = userRepository.findOne(userId);
user.getCars().add(car);
car.setUser(user);
carRepository.save(car);
return car;
}
非常感谢任何帮助。
非常感谢
答案 0 :(得分:1)
我认为mappedBy
需要指向拥有该关系的字段名称。在这种情况下,这是userModel
所以它应该是
@OneToMany(mappedBy = "userModel", cascade = CascadeType.ALL)
如果关系是双向的,则mappedBy元素必须是 用于指定实体的关系字段或属性 是这段关系的所有者。 (来自https://www.objectdb.com/api/java/jpa/OneToMany)
另外我认为你的@JoinColumn
注释是错误的。它应该指定用于加入相关实体的列 - 因此它不能是ID
,而是类似user_id
请参阅https://www.objectdb.com/api/java/jpa/JoinColumn#
你的ddl也错了 - 这篇文章说汽车和用户有相同的id - 你不想要的 - 你的ddl缺少用户外键的实际列
FOREIGN KEY (id)
REFERENCES game.user (id)
因此,如果您将JoinColumn更改为@JoinColumn(name = "user_id")
,则必须使用外键的ddl。
CREATE TABLE game.car (
id INT(11) NOT NULL AUTO_INCREMENT COMMENT '',
make VARCHAR(15) NOT NULL COMMENT '',
model VARCHAR(15) NOT NULL COMMENT '',
PRIMARY KEY (id) COMMENT '',
user_id INT(11),
CONSTRAINT fk_user
FOREIGN KEY (user_id)
REFERENCES game.user (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
如果我可以将2美分加到映射中 - 尽可能避免双向关系。