2017-01-12 2 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 
    .......... 


} 

И FINA 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.

Я могу определить отношение @ManyToMany к User и Car. В этом случае, если я сделаю user.getCars().getModels() или user.getCars().getModels().get(0).getVariants() В итоге я получаю все, что есть в БД.

Как мне отобразить User и Car таким образом, чтобы получить следующий результат?

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

Кроме того, если вы чувствуете, я не разработаны мои классы сущностей права, пожалуйста, дайте мне знать, как я могу улучшить.

Благодаря

+0

I т Похоже, что вы пытаетесь иметь это в таблице, однако это не имеет ничего общего с таблицей, насколько правила нормализации обеспокоены этим получает данные делятся на разные столы но при получении вы можете получить это в этом стиле –

+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 in everyPojo

+0

Да, но я чувствую, что это похоже на сопоставление @ManyToMany между пользователем и автомобилем. Я хочу сделать user.getCars() и узнать, в какой машине, модели и вариантах он владеет. Можете ли вы помочь мне в том, как я могу это достичь? – 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 сек, где это возможно (LinkedHashSet), или List s, когда вам нужно @OrderColumn
  2. дают простые имена: избегать MODEL_NAME, просто использовать NAME
  3. использовать @MappedSuperclass, особенно если у вас есть суррогатный идентификатор для всех объектов

вы можете:

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'"; 
Смежные вопросы