Как построить отношения один-ко-многим с различными объектами, которые имеют составной ключ с Hibernate, JPA? - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу построить классы сущностей для следующих отношений.Я хочу сущность ProductWiseCustomer, которая имеет составной ключ.Эти ключи также сопоставлены с сущностями Product и Customer.Как достичь цели?

Entity Relationship

Пока что я сделал.

Product.java

    @Entity
    @Table(name = "product")
    public class Product {
        @Id
        private Long productId;
        private String productName;
        private Decimal productPrice;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = CustomerProductCompound.class)
        private Set<CustomerProductCompound> customerProductCompound;

        //Constructor
        //Setter-getter
    }

Customer.java

    @Entity
    @Table(name = "customerinfo")
    public class CustomerInfo {
        @Id

        private Long customerId;
        private String customerName;
        private Boolean isActive;

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = CustomerProductCompound.class)
        private Set<CustomerProductCompound> customerProductCompound;

   //Constructor
   //Setter-getter
}

CustomerProductCompound.java

    @Embeddable
    public class CustomerProductCompound
   {

        @ManyToOne
        @JoinColumn(name = "customerId")
        private CustomerInfo customerInfo;

        @ManyToOne
        @JoinColumn(name = "productId")
        private Product product;

        //Constructor
        //Setter-getter
    }

При запуске приложения возникает следующая ошибка:

Использование @OneToMany или @ManyToMany для таргетинга на не сопоставленный класс: com.auth.model.CustomerInfo.customerProductCompound [com.auth.model.CustomerProductCompound].

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

CustomerProductCompound, так как вы определили только первичный ключ ProductWiseCustomer.Ваши коллекции внутри CustomerInfo и Product должны содержать ProductWiseCustomer элементов, а не их ключ.

@Entity
@Table(name = "product")
public class Product {
    @Id
    private Long productId;
    private String productName;
    private Decimal productPrice;

    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    private Set<ProductWiseCustomer> productWiseCustomers;

}

@Entity
@Table(name = "customerinfo")
public class CustomerInfo {
    @Id

    private Long customerId;
    private String customerName;
    private Boolean isActive;

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    private Set<ProductWiseCustomer> productWiseCustomers;

}

Обратите внимание, что в аннотации добавлено свойство mappedBy.Необходимо указать имя свойства на той стороне, которая ссылается на этот объект.Имя JPA, а не имя SQL.targetEntity редко требуется, и я предложил orphanRemoval, так что если вы удалите один из набора, вам не нужно будет удалять его вручную, чтобы он исчез.

Что касаетсяProductWiseCustomer, вам нужен тот же ключ, который показан модульным кодером

@Embeddable
public class ProductCustomerKey {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customerId)
    private Customer customer;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "productId")
    private Product product;
}

Но я рекомендую использовать @IdClass вместо @EmbeddedId

@Entity
@IdClass(ProductCustomerKey.class)
public class ProductWiseCustomer {
    @ManyToOne(fetch = FetchType.LAZY) // should be lazy here
    @JoinColumn(name = "customerId)
    private Customer customer;

    @ManyToOne(fetch = FetchType.LAZY) // should be lazy here
    @JoinColumn(name = "productId")
    private Product product;

    private OffsetDateTime createDate;
    private String remarks;
    // getters, setters
}
0 голосов
/ 18 апреля 2019

Одним из решений является использование составного идентификатора с @ EmbeddableId.

@Entity
public class ProductWiseCustomer {
    @EmbeddedId
    private ProductCustomerKey key;

}

@Embeddable
public class ProductCustomerKey {

    @ManyToOne(fetch = FetchType.LAZY)
    private Customer customer;

    @ManyToOne(fetch = FetchType.LAZY)
    private Product product;
}

См. Документацию по спящему режиму:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite-aggregated

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...