Ваше исследование уже идет в правильном направлении: вам понадобятся @OneToMany
отношения.Лучшие описания для Hibernate имеет Влад Михалча .На его веб-странице вы также можете найти хорошее объяснение этих отношений: Лучший способ отобразить отношения @OneToMany с JPA и Hibernate .
Во-первых, вам нужно будет правильно создать объекты(сущность представлена таблицей в реляционной базе данных).
Однонаправленный (@OneToMany)
@Entity
@Table(name = "product")
public class Product
{
@Id
@GeneratedValue
private Long productID;
private String productName;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<ProductDetail> productDetails;
//Constructors, getters and setters...
}
@Entity
@Table(name = "product_details")
public class ProductDetail
{
@Id
@GeneratedValue
private Long detailID;
private String description;
//Constructors, getters and setters...
}
Это основано на однонаправленном отношении.Следовательно, каждый Продукт знает все выделенные ProductDetails.Но ProductDetails не имеют ссылки на свои продукты.
Однонаправленный (@ManyToOne)
@Entity
@Table(name = "product")
public class Product
{
@Id
@GeneratedValue
private Long productID;
private String productName;
//Constructors, getters and setters...
}
@Entity
@Table(name = "product_details")
public class ProductDetail
{
@Id
@GeneratedValue
private Long detailID;
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = product_id)
private Product product;
//Constructors, getters and setters...
}
В этом однонаправленном отношении только ProductDetails знает, какой Продукт назначен им.Учтите это для огромного количества объектов ProductDetail для каждого Product.
Аннотация @JoinColumn указывает имя столбца таблицы product_details
, в которой сохраняется внешний ключ для Product (его идентификатор).Он также работает без, но с этой аннотацией он более эффективен.
Двунаправленный (@OneToMany и @ManyToOne)
@Entity
@Table(name = "product")
public class Product
{
@Id
@GeneratedValue
private Long productID;
private String productName;
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ProductDetail> productDetails;
//Constructors, add, remove method, getters and setters...
}
@Entity
@Table(name = "product_details")
public class ProductDetail
{
@Id
@GeneratedValue
private Long detailID;
private String description;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = product_id)
private Product product;
//Constructors, getters and setters...
}
С двунаправленными объектами отношений обеих сторон (Product и ProductDetail) известнокакие другие объекты были им присвоены.
Но, по словам Влада Михалча, это не следует использовать, если существует слишком много ProductDetails для каждого продукта .
Также не забывайте реализовывать правильноедобавить и удалить методы для записей в списке (см. article снова, в противном случае странные исключения ).
Разное
При каскадных изменениях в Productтакже применяются к его ProductDetails.OrphanRemoval избегает использования ProductDetails без Product.
Product product = new Product("Interesting Product");
product.getProductDetails().add(
new ProductDetails("Funny description")
);
product.getProductDetails().add(
new ProductDetails("Different description")
);
entityManager.persist(product);
Часто вопрос о правильных методах equals и hashCode является сложной головоломкой в вашей голове.Специально для двунаправленных отношений, но также и в других ситуациях, использующих соединение с базой данных, рекомендуется реализовать их довольно просто, как описано Владом .
Хорошей практикой является использование объектов для примитивных типов данных.также.Это дает вам возможность получить правильное значение NULL при вызове метода получения.
Избегать энергичной выборки должно быть совершенно ясно ...
Когда вы сейчас пытаетесь получитьProduct вне базы данных, объект автоматически получает список всех назначенных ему ProductDetails.Для этого можно использовать JPA репозитории в Spring .Простые методы не должны быть реализованы.Если вам нужно больше настраивать функциональность, взгляните на эту статью Baeldung .