2017-01-12 57 views
1

我想我的实体以下列方式映射:JPA的Hibernate映射超过2个实体

我有一个用户,他买了车(具体品牌,型号和变体)。

为此,我创建了以下类。

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 
    ...... 
} 

CarVariant.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 
    .......... 


} 

而国际泳联LLY,User.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   | 
-------------------------------------------------------- 

此外,如果你觉得我没有设计我的实体班的权利,请随时让我知道我可以改进。

感谢

+0

余吨看起来像你想有此表但它没有什么尽量做表作为规范化规则而言这个数据被分成不同的表但在提取时可以使用此风格获取此文件 –

+0

谢谢。你能不能让我知道我究竟能够以这种风格获取?这正是我卡住的地方。 – sriramsridharan

回答

1

如果您获取的主要对象是这样

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(); 

这样你可以得到每个对象,试图获取,但请记住,你正在使用FethType.Lazy而cascadeType.All在everyPojo

+0

是的,但我觉得这就像在用户和汽车之间做一个@ManyToMany映射。我想做一个user.getCars(),并确切地找出他拥有的Car,Model和Variant。你能帮我解决我能做到的吗? – sriramsridharan

+0

我会将其添加到此 –

0

目前尚不清楚为什么你需要这样一个所有表格都嵌套关系的键。

我的两分钱:

@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. 避免Collection秒:使用Set S其中可能的(LinkedHashSet),或List那时你需要一个@OrderColumn
  2. 给予简单的名字:避免MODEL_NAME,只是使用NAME
  3. 使用@MappedSuperclass,特别是如果您有所有实体的代理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'";