如何在JPA实体/JPARepository(或CrudRepository)中使用连接?

u91tlkcl  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(159)

我 对 Spring 、 JPA 、 JPARepository 概念 等 还 不 熟悉 。
规则 如下 :一 个 用户 通过 比赛 只能 赢得 一 辆 汽车 , 但 汽车 可以 被 许多 用户 赢得 ( 例如 , 用户 Juan 赢得 了 一 辆 丰田 , 用户 Maria 赢得 了 一 辆 福特 , 但 用户 Jaime 也 赢得 了 一 辆 丰田 , 等等 ) 。
我 有 一 个 表 " users " 和 另 一 个 表 " cars " , 在 数据 库 中 , 表 cars 中 已经 有 数据 了 。
汽车 表 :

----------------------
| id_car  |   brand  |
----------------------
|     1   |  Toyota  |
----------------------
|     2   |    Ford  |
----------------------
|     3   |   Honda  | 
----------------------

中 的 每 一 个
用户 表 结构 :

---------------------------
| id_user | name | id_car |
---------------------------

格式
在 Java 代码 中 , 实体 将 以 这种 方式 声明 ;
载 具 :

@Entity
@Table(name="cars")
public class Car {
    @Id
    @Getter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column("id_car")
    private int idAuto;

    @Getter
    @Setter
    private String brand;
}

格式
用户 名 :

@Entity
@Table(name="users")
public class User {
    @Id
    @Getter
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column("id_user")
    private int idUser;

    @Getter
    @Setter
    private String name;

    // private int idCar; ???
}

格式
如何 将 用户 与 汽车 链接 起来 ? 如果 我 将 OneToOneJoinColumn(name="id_car") 声明 给 一 个 属性 , 该 属性 返回 并 分配 用户 实体 中 Car 类型 的 对象 , 即 :

@Getter
@Setter
private Car car;

格式
我 如何 告诉 存储 库 或 实体 我 只 想 将 一 个 新 用户 加入 到 DB 中 已经 存在 的 汽车 中 , 因为 要 声明 我 之前 提到 的 这个 属性 , 我 必须 为 它 分配 一 个 Car 类型 的 Object 。

user.setCar(new car("Toyota"));

格式
或者 :

Car car = repositoryFindById(2);
user.setCar(car);

格式
我 不 想 加入 一 辆 新车 , 因为 id 为 1 的 车 已经 存在 , 我 只 想 加入 它 , * * 我 不 想 创建 两 个 事务 ( findByIdsave ) * * , 我 如何 执行 以下 操作 :

user.setCar(1); // pass only the car id.

格式
是否 有 任何 方法 可以 实现 这 一 点 ? 或 * * 正确 的 方法 是 什么 ? * *

iyr7buue

iyr7buue1#

我相信您可以使用@Query注解并编写一个本地查询,我们在工作中使用Hibernate JPA,并且也有连接表,但是如果您要从可以通过Map连接的数据中查找特定信息,则需要一个本地自定义查询。
此外,您不需要CRUD存储库接口,当查询很简单时,它很有用,但您希望获得的数据越具体,就越需要编写自己的SQL或使用Hibernate查询语言。
因此,您可以采取以下几种方式:
1.使用@Query注解并编写您自己的本机查询
@Query(value = "SELECT * FROM table WHERE column like %info% ", nativeQuery = true) List<AnEntity> getEntity(@Param("info") String info);
1.插入EntityManager并使用createNativeQuery方法
1.还有Hibernate Criteria api,基本上可以用java Package sql,并使用一些难以理解的方法进行自定义查询。

31moq8wy

31moq8wy2#

你可以得到一个汽车的参考而不需要像这样访问数据库

Car car = entityManager.getReference(Car.class, 1);
user.setCar(car);

如果数据库中没有id=1的关联Car,则在持久化用户时将抛出异常

相关问题