Bonjour,
J'ai une entité dans laquelle j'ai une classe Embedded.
Cette embedded classe est elle-même une classe abstraite.
Dans la spec il est mentionné que l'héritage n'est pas supporté pour des classes embeddedable mais qu'il est malgré tout possible de l'implémenter via un customizer.
C'est ce que j'ai mis en place mais lors du lancement de mes tests unitaires, je me prend cette exception
Voici ce que j'ai mis en place
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 javax.persistence.PersistenceException: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Deployment of PersistenceUnit [be.buyway.phenix.DossierDAOUnitTest] failed. Close all factories for this PersistenceUnit. Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.IntegrityException Descriptor Exceptions: --------------------------------------------------------- Exception [EclipseLink-108] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Cannot find value in class indicator mapping in parent descriptor [null]. Descriptor: RelationalDescriptor(be.buyway.business.dto.credential.visibilityscope.AbstractVisibilityScopeSpecification --> [DatabaseTable(VISIBILITY_SCOPE)]) Runtime Exceptions: --------------------------------------------------------- at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createDeployFailedPersistenceException(EntityManagerSetupImpl.java:820) at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:760) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:204) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:304) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:336) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:302) at be.buyway.business.granting.dao.DossierDAOUnitTest.setup(DossierDAOUnitTest.java:48) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException Exception Description: Deployment of PersistenceUnit [be.buyway.phenix.DossierDAOUnitTest] failed. Close all factories for this PersistenceUnit. Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.IntegrityException Descriptor Exceptions: --------------------------------------------------------- Exception [EclipseLink-108] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Cannot find value in class indicator mapping in parent descriptor [null]. Descriptor: RelationalDescriptor(be.buyway.business.dto.credential.visibilityscope.AbstractVisibilityScopeSpecification --> [DatabaseTable(VISIBILITY_SCOPE)]) Runtime Exceptions: --------------------------------------------------------- at org.eclipse.persistence.exceptions.EntityManagerSetupException.deployFailed(EntityManagerSetupException.java:238) ... 30 more Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.IntegrityException Descriptor Exceptions: --------------------------------------------------------- Exception [EclipseLink-108] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DescriptorException Exception Description: Cannot find value in class indicator mapping in parent descriptor [null]. Descriptor: RelationalDescriptor(be.buyway.business.dto.credential.visibilityscope.AbstractVisibilityScopeSpecification --> [DatabaseTable(VISIBILITY_SCOPE)]) Runtime Exceptions: --------------------------------------------------------- at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:696) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:632) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.initializeDescriptors(DatabaseSessionImpl.java:568) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.postConnectDatasource(DatabaseSessionImpl.java:799) at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.login(DatabaseSessionImpl.java:756) at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:241) at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:685) ... 28 more
L'entité
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Entity @Access(AccessType.FIELD) @Table(name = "VISIBILITY_SCOPE") public class PhysicalRetailerVisibilityScope { @Id @Column(name = "SCOPE_NAME") private String name; @Column(name = "SPECIFICATION_TYPE", nullable = false) @Embedded private AbstractVisibilityScopeSpecification specification;
La classe embedded
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Embeddable @Customizer(VisibilityScopeSpecificationCustomizer.class) public abstract class AbstractVisibilityScopeSpecification { protected abstract Predicate toPredicate(Join<?, ?> join, CriteriaQuery<?> cq, CriteriaBuilder cb); }
Le customizer pour la classe parent
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public class VisibilityScopeSpecificationCustomizer implements DescriptorCustomizer { @Override public void customize(final ClassDescriptor descriptor) throws Exception { descriptor.getInheritancePolicy().setSingleTableStrategy(); descriptor.getInheritancePolicy().setClassIndicatorFieldName("SPECIFICATION_TYPE"); descriptor.getInheritancePolicy().addClassIndicator(CarrefourGroupVisibilityScopeSpecification.class, "CARREFOUR_GROUP_SPEC"); } }
la classe enfant
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 @Embeddable @Customizer(CarrefourGroupVisibilityScopeSpecificationCustomizer.class) public class CarrefourGroupVisibilityScopeSpecification extends AbstractVisibilityScopeSpecification { private static final String[] UNNEEDED_CARREFOUR_VENDORS = new String[] { "2688372", "2491314", "2685071", "2689636", "2700656", "2689123", "2066181" }; @Override protected Predicate toPredicate(final Join<?, ?> join, final CriteriaQuery<?> cq, final CriteriaBuilder cb) { Predicate carrefourShopPredicate = cb.equal(join.get("union").get("number"), UnionConstants.CARREFOUR_SHOPS); Predicate auto5Predicate = cb.equal(join.get("chain").get("number"), ChainConstants.Id.AUTO5); Predicate notRADPredicate = cb.notEqual(join.get("positionCodes").get("currentPosition"), "RAD"); Predicate unneededShopsPredicate = cb.not(join.get("number").in(Arrays.asList(UNNEEDED_CARREFOUR_VENDORS))); Predicate toPredicate = cb.and(cb.or(carrefourShopPredicate, auto5Predicate), notRADPredicate, unneededShopsPredicate); return toPredicate; } }
et enfin le customizer pour la classe enfant
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class CarrefourGroupVisibilityScopeSpecificationCustomizer implements DescriptorCustomizer { @Override public void customize(final ClassDescriptor descriptor) throws Exception { descriptor.getInheritancePolicy().setParentClass(AbstractVisibilityScopeSpecification.class); } }
Si quelqu'un a une quelconque idée, elle est la bienvenue.
Merci pour votre aide
Partager