当前位置: 首页 > 知识库问答 >
问题:

JPA Hibernate映射超过 2 个实体

吕俊美
2023-03-14

我希望以以下方式映射实体:

我有一个用户,他买了一辆车(特定的品牌、型号和变体)。

为此,我创建了以下类。

Car.java汽车

@Entity
@Table(name="CARS")
public class Car {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="CAR_ID")
    private int id;

    @Column(name="CAR_MAKER")
    private String maker;

    @OneToMany(mappedBy="car")
    private Collection<CarModel> models =new ArrayList<CarModel>();

    ......
    Getters and Setters go here
    ......
}

CarModel.java

@Entity
@Table(name="CAR_MODELS")
public class CarModel {


    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="MODEL_ID")
    private int modelId;

    @Column(name="MODEL_NAME")
    private String modelName;

    @ManyToOne
    @JoinColumn(name="CAR_ID")
    private Car car;

    @OneToMany(mappedBy="model")
    private Collection<CarVariant> variants = new ArrayList<CarVariant>();

    ......
    Getters and Setters go here
    ......
}

汽车变体.java

@Entity
@Table(name="CAR_VARIANT")
public class CarVariant {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column (name="VARIANT_ID")
    private int variantId;

    @Column(name="VARIANT_NAME")
    private String variantName;

    @Column(name="FUEL_TYPE")
    private String fuelType;

    @ManyToOne
    @JoinColumn(name="MODEL_ID")
    private CarModel model;

    ..........
      Getters and setters go here
    ..........


}

最后,用户.java

@Entity
@Table(name="MASUSER")
public class User {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="USER_REC_ID")
    private int recordId;

    @Column(name="USER_ID")
    private String id;

    @Column(name="USER_NAME")
    private String name;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE")
    private String phone;


    private Collection<Car> cars = new ArrayList<Car>();

}

现在,我的问题是。

在现实生活中,用户可能拥有许多汽车,每辆汽车都有特定的品牌、型号和变体。我想用JPA / Hibernate实现这样的功能。

我可以定义@ManyToManyUserCar的关系。在这种情况下,如果我执行user.getCars()。getModels()user.getCars().getModels(().get(0)。getVariants()我最终得到了数据库中的所有内容。

如何映射UserCar以获得以下输出?

--------------------------------------------------------
| USER_ID     | CAR_ID     | MODEL_ID    | VARIANT_ID  |
--------------------------------------------------------
| 1           | 1          | 2           | 3           |
--------------------------------------------------------
| 1           | 1          | 2           | 2           |
--------------------------------------------------------
| 3           | 2          | 1           | 1           |
--------------------------------------------------------

另外,如果您觉得我没有正确设计我的实体类,请随时告诉我如何改进。

谢谢

共有2个答案

文喜
2023-03-14

不清楚为什么需要这样一个包含嵌套关系中所有键的表。

我的两分钱:

@MappedSuperclass
public abstract class AbstractEntity
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column
    private Long id;

    ......
    Getters and Setters go here
    ......
}

@Entity
@Table(name = "MANUFACTURER")
public class Manufacturer extends AbstractEntity 
{
    @Column
    private String name;

    @OneToMany(mappedBy = "manufacturer")
    private Set<CarModel> models = new LinkedHashSet<>();

    ......
    Getters and Setters go here
    ......
}

@Entity
@Table(name = "CAR_MODEL")
public class CarModel extends AbstractEntity 
{
    @NotNull
    @ManyToOne(optional = false)
    @JoinColumn(name = "MANUFACTURER_ID")
    private Manufacturer manufacturer;

    @Column
    private String name;

    @OneToMany(mappedBy = "model")
    private Set<CarVariant> variants = new LinkedHashSet<>();

    ......
    Getters and Setters go here
    ......
}

@Entity
@Table(name = "CAR_VARIANT")
public class CarVariant extends AbstractEntity 
{
    @NotNull
    @ManyToOne(optional = false)
    @JoinColumn(name = "CAR_MODEL_ID")
    private CarModel model;

    @Column
    private String name;

    @Column(name="FUEL_TYPE")
    private String fuelType;

    @OneToMany(mappedBy="variant")
    private Set<Car> cars = new LinkedHashSet<>();

    ......
    Getters and Setters go here
    ......
}

@Entity
@Table(name = "CAR")
public class Car extends AbstractEntity 
{
    @NotNull
    @ManyToOne(optional = false)
    @JoinColumn(name = "CAR_VARIANT_ID")
    private CarVariant variant;

    @Column(name = "REGISTRATION_NUMBER")
    private String registrationNumber;


    @ManyToMany(mappedBy = "cars")
    private Set<User> users = new LinkedHashSet<>();

    ......
    Getters and Setters go here
    ......
}

@Entity
@Table(name = "USER")
public class User extends AbstractEntity 
{
    @Column
    private String name;

    @Column
    private String email;

    @Column
    private String phone;

    @ManyToMany
    @JoinTable(name = "USER_CAR", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "CAR_ID"))
    private Set<Car> cars = new LinkedHashSet<>();

    ......
    Getters and Setters go here
    ......
}
  1. 避免集合s:尽可能使用Sets(LinkedHashSet),或Lists当您需要@OrderCol的
  2. 给出简单的名称:避免MODEL_NAME,只需使用NAME
  3. 使用@MepdSuperclass,特别是如果您有所有实体的代理ID

您现在可以:

Car car = ...;
String manufacturerName = car.getVariant().getModel().getManufacturer().getName();

String jpql = "select c from Car c where c.variant.model.name = 'Golf' and c.variant.fuelType = 'Diesel'";
关翰
2023-03-14

如果像这样获取主对象

Criteria criteria=session.createCriteria(User.class);
List<Object> list=criteria.list();
User user=(User)list.get(0);
Car car=user.getCar();
CarModel carModel=car.getCarModel();
CarVarient carVarient=carModel.getCarVarient();

通过这种方式,您可以获取您试图获取的每个对象,但请记住,您使用的是<code>FethType。懒惰和cascadeType。所有在每个Pojo

 类似资料:
  • 我需要记录各种业务,他们的城市和他们在每个城市的分支机构。每个企业可能在不同的城市,在每个城市可能有不同的分支机构。

  • 我有三个表在我的MySQL数据库,看起来像下面这些: 注意:我从那些表中删除了一些定义部分,比如AUTO_INCREMENT,以便使模式更简单。 我的问题是,我需要将这些表映射到实体类,比如和,但我不知道如何管理表中的列,以及如何管理实体中的这些关系。 我的第一个猜测是: 文件 文件 这些实体将生成我需要的三个表,但在表中没有我真正需要的列。把它放在那里很重要。我还可以创建第三个实体,例如,但我不

  • 我有两个地图,键为整数,值为双倍。 我想创建第三个按键排序的映射,值将是两个映射的双精度列表。 地图1: Map2: 最终地图: 如上所述,如果一个地图中的一个键在另一个地图中丢失,则另一个地图的最终地图中的值应默认为0.00 我可以使用putAll方法将所有键放入第三张地图。但如何按照我的意愿设定这些值呢? 感谢阅读!

  • 我有一个字符串数组和一个整数数组。如何使用第一个作为键,第二个作为值来创建地图? 如何在 Kotlin 中将 List 转换为 Map?不能解决这个问题;我有2个数组,想要一个地图。

  • 快速总结我想要实现的目标。请给出实施或设计建议:) 我有两个表:用户,图像。在UserDO中,我希望保留一组所有用户的图像,以及单个图像,即用户的肖像(在我的示例中,该组将包括肖像): 在ImageDO中,我有一个userid作为外键来记录哪个用户上传了图像。但是它没有布尔值,因为认为一个用户可能会上传许多图像,但只有一个是肖像。 有什么方法可以实现这一点吗?或者我需要维护另一个表(例如,Port

  • 我有以下模式: 项目(ID,名称)项目用户(项目ID,用户ID)用户(名称,ID) 实体如下 显然是一对多。项目可以有多个用户。 现在,我的目标是编写jooq查询,在那里我可以获取已经有相应用户的项目对象。 但是当预期约15时,查询将恢复千分之一的结果