Аудит соединения «многие ко многим» с помощью составного ключа - PullRequest
0 голосов
/ 17 октября 2018

У меня есть несколько сущностей, которые имеют следующие отношения: Упрощенная ERD

Во всех таблицах объединения есть дополнительные поля (не показаны).

У меня проблемы с аудитомсоединения для OrderOutletProducts.

Моя попытка:

OutletProduct

@Audited
@Entity
public class OutletProduct {

    @EmbeddedId
    private OutletProductPk pk;

    @ManyToOne
    @MapsId("outletId")
    @JoinColumn(name = "outlet_id")
    private Outlet outlet;

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

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "outletProduct")
    private Set<OrderOutletProduct> orderOutletProducts = new HashSet<OrderOutletProduct>();
}

OutletProductPk

@Embeddable
public class OutletProductPk implements Serializable { 

    @Column(name = "outletId")
    private Long outletId;

    @Column(name = "productId")
    private Long productId;

    // equals, hashcode, etc...
}

OrderOutletProduct

@Audited
@Entity
public class OrderOutletProduct {

    @EmbeddedId
    private OrderOutletProductPk pk;

    @ManyToOne
    @MapsId("orderId")
    @JoinColumn(name = "order_id")
    private Order order;

    @ManyToOne
    @MapsId("outletProductPk")
    @JoinColumns({
        @JoinColumn(name = "outlet_id"),
        @JoinColumn(name = "product_id"),
    })
    private OutletProduct outletProduct;
}

OrderOutletProductPk

@Embeddable
public class OrderOutletProductPk implements Serializable { 

    private Long orderId;

    private OutletProductPk outletProductPk;

    // equals, hashcode, etc...
}

Это приводит к:

Invocation of init method failed; nested exception is org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
[...]
Caused by: org.hibernate.MappingException: Type not supported: org.hibernate.type.ComponentType
        at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addIdProperties(IdMetadataGenerator.java:80)
        at org.hibernate.envers.configuration.internal.metadata.IdMetadataGenerator.addId(IdMetadataGenerator.java:144)
        at org.hibernate.envers.configuration.internal.metadata.AuditMetadataGenerator.generateFirstPass(AuditMetadataGenerator.java:632)
        at org.hibernate.envers.configuration.internal.EntitiesConfigurator.configure(EntitiesConfigurator.java:94)
        at org.hibernate.envers.boot.internal.EnversServiceImpl.doInitialize(EnversServiceImpl.java:152)
        at org.hibernate.envers.boot.internal.EnversServiceImpl.initialize(EnversServiceImpl.java:117)
        at org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl.produceAdditionalMappings(AdditionalJaxbMappingProducerImpl.java:99)
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:288)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:848)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:875)
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:135)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:340)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
        ... 59 more

Наличие envers в трассировке стека заставило меня попытаться удалить @Audited, но эта попытка была встречена с жалобами нанеаудированная сущность присоединилась к проверяемому объекту, и хотя снятие с контроля всей моей схемы устраняет ошибку, о моих требованиях не может быть и речи.

Я использую Hibernate 5.1.12.Final с соответствующими Envers.

Редактировать: Похоже, проблема описана здесь .

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Когда я удаляю аннотации @JoinColumn, аннотации @Audit и переименовываю таблицу Order в Orders, все выглядит нормально.Так что это не похоже на JPA конкретную ошибку в корне.Order является зарезервированным ключевым словом SQL.Эти конкретные @JoinColumn аннотации

@JoinColumns({
    @JoinColumn(name = "outlet_id"),
    @JoinColumn(name = "product_id"),
})

дали мне ошибку проверки в Eclipse.

Указанное имя столбца должно быть указано при наличии нескольких столбцов соединения

Вывод.

Hibernate: create table OrderOutletProduct (order_id bigint not null, outletProduct_outlet_id bigint not null, outletProduct_product_id bigint not null, primary key (order_id, outletProduct_outlet_id, outletProduct_product_id))
Hibernate: create table Orders (id bigint generated by default as identity (start with 1), primary key (id))
Hibernate: create table Outlet (id bigint generated by default as identity (start with 1), primary key (id))
Hibernate: create table OutletProduct (outlet_id bigint not null, product_id bigint not null, primary key (outlet_id, product_id))
Hibernate: create table Product (id bigint generated by default as identity (start with 1), primary key (id))
Hibernate: alter table OrderOutletProduct add constraint FK31ytkakdnwf3mvw7p6paij7u6 foreign key (order_id) references Orders
Hibernate: alter table OrderOutletProduct add constraint FKjsywutttlonx76evhm9b0kk02 foreign key (outletProduct_outlet_id, outletProduct_product_id) references OutletProduct
Hibernate: alter table OutletProduct add constraint FKi0nyyoj3d031g0sn6gkutbxn5 foreign key (outlet_id) references Outlet
Hibernate: alter table OutletProduct add constraint FKr3s09f6ofstlb1qomfwfjsjwy foreign key (product_id) references Produc

Итак, я предлагаю начать с него и постепенно добавлять что-то, чтобы быть уверенным, что вы понимаете, как аннотации должны функционировать, пока вы не сможете быть более конкретными в отношении любой ошибки или проблемы, с которой вы столкнулись.

0 голосов
/ 17 октября 2018

Я думаю, что ваша проблема с именами столбцов.В OutletProductPK вы используете

@Column(name = "outletId")
private Long outletId;

@Column(name = "productId")
private Long productId;

, а в других классах вы используете product_id и outlet_id.Какие имена в столбцах вашей базы данных?

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