JPA关系问题

时间:2016-09-02 11:59:12

标签: java mysql jpa spring-boot

我正在研究一个项目,我遇到了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; 
}

非常感谢任何帮助。

非常感谢

1 个答案:

答案 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美分加到映射中 - 尽可能避免双向关系。