【问题标题】:JPA Relationship issueJPA 关系问题
【发布时间】:2023-03-09 04:58:01
【问题描述】:

我正在做一个项目,我遇到了 JPA 关系的问题。有人建议我在另一个线程上更改一些内容,但是我仍然无法使其正常工作。

我遇到了一个异常,我知道问题出在哪里,但不知道如何解决。

这里是用户类:

@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;

}

这是汽车类:

@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;

}

这里是服务实现:

@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; 
}

非常感谢任何帮助。

非常感谢

【问题讨论】:

  • 能否请您链接到您提到的其他线程?另外,请发布异常的堆栈跟踪。
  • 我在你的代码sn-p中没有找到这个方法:user.getGpsLocationModels()
  • 您好 Cascer,感谢您的回复。请使用其他线程和完整的堆栈跟踪找到已编辑的帖子
  • 嗨 Naman,对不起,这是一个错字,它是 getCars(一个 ArrayList 集合)。谢谢你的位置。
  • 您对 1-N bidir FK 关系的映射基本上是错误的。不能把N方的PK当成FK给1方! (从那时起,每个集合中只能有 1 个元素!!!)。您需要一个单独的 FK 列。您将找到的所有 JPA 参考文档都清楚地告诉您如何执行此操作。这里datanucleus.org/products/accessplatform_5_0/jpa/orm/…

标签: java mysql jpa spring-boot


【解决方案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 美分添加到映射中 - 尽量避免双向关系。

【讨论】:

  • 嗨 Mathias,我已将 mappedBy 更改为 userModel,但仍然没有区别。 :(。关于@JoinColumn,我已经尝试过它们都没有运气。外键是数据库中的 fk_user.id
  • 有人建议我使用来自另一个线程的双向来检索特定用户的一辆和所有汽车。最初我没有使用双向,但这就是有人告诉我的方式,可能值得一试,但是仍然无法正常工作
  • 是的,fk 在名为 fk_user 的 car 表中,引用列是 id。
  • 我只是试了一下——我的建议是关于mappedByJoinColumn 我可以持久化实体。我正在使用内存数据库进行测试。我认为您的架构在数据库中不正确-您是如何创建它的?使用 spring.jpa.generate-ddl=true 对空数据库运行它并再次检查
  • 让我快速发布它,向您展示如何创建 :)。对我来说有些奇怪,因为我认为映射看起来不错,这就是为什么我无法弄清楚。
猜你喜欢
  • 1970-01-01
  • 2017-12-12
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多