001    package org.kuali.rice.krad.data.jpa.eclipselink;
002    
003    import org.apache.commons.lang.StringUtils;
004    import org.junit.Test;
005    import org.kuali.rice.krad.bo.DataObjectBase;
006    import org.kuali.rice.krad.data.jpa.FilterGenerator;
007    import org.kuali.rice.krad.data.jpa.FilterGenerators;
008    import org.kuali.rice.krad.data.jpa.PortableSequenceGenerator;
009    import org.kuali.rice.krad.data.provider.annotation.ExtensionFor;
010    import org.kuali.rice.krad.test.KRADTestCase;
011    import org.kuali.rice.krad.test.document.bo.SimpleAccount;
012    import org.springframework.context.ConfigurableApplicationContext;
013    import org.springframework.context.support.ClassPathXmlApplicationContext;
014    
015    import javax.persistence.Access;
016    import javax.persistence.AccessType;
017    import javax.persistence.Column;
018    import javax.persistence.Entity;
019    import javax.persistence.EntityManager;
020    import javax.persistence.EntityManagerFactory;
021    import javax.persistence.FetchType;
022    import javax.persistence.GeneratedValue;
023    import javax.persistence.Id;
024    import javax.persistence.JoinColumn;
025    import javax.persistence.ManyToOne;
026    import javax.persistence.MappedSuperclass;
027    import javax.persistence.OneToMany;
028    import javax.persistence.OrderBy;
029    import javax.persistence.Table;
030    
031    import java.util.ArrayList;
032    import java.util.List;
033    
034    import static org.junit.Assert.*;
035    
036    /**
037     * Integration test for KradEclipseLinkCustomizer.
038     *
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     */
041    public class KradEclipseLinkCustomizerTest extends KRADTestCase {
042    
043        private ConfigurableApplicationContext context;
044    
045        @Override
046        protected void setUpInternal() throws Exception {
047            super.setUpInternal();
048            context = new ClassPathXmlApplicationContext("KradEclipseLinkCustomizerTest.xml", getClass());
049        }
050    
051        @Override
052        public void tearDown() throws Exception {
053            if (context != null) {
054                context.close();
055            }
056            super.tearDown();
057        }
058    
059        @Test
060        public void testSequences_AnnotationAtClassLevel() throws Exception {
061            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
062            assertNotNull(factory);
063    
064            TestEntity testEntity1 = new TestEntity();
065            testEntity1.setName("MyAwesomeTestEntity1");
066    
067            // number in this case is generated from a sequence
068            assertNull(testEntity1.getNumber());
069    
070            EntityManager entityManager = factory.createEntityManager();
071            try {
072                entityManager.persist(testEntity1);
073                assertNotNull(testEntity1.getNumber());
074            } finally {
075                entityManager.close();
076            }
077    
078            TestEntity testEntity2 = new TestEntity();
079            testEntity2.setName("MyAwesomeTestEntity2");
080    
081            assertNull(testEntity2.getNumber());
082    
083            entityManager = factory.createEntityManager();
084            try {
085                // try merge here and make sure it works with that as well
086                testEntity2 = entityManager.merge(testEntity2);
087                assertNotNull(testEntity2.getNumber());
088                assertEquals(Integer.valueOf(Integer.valueOf(testEntity1.getNumber()).intValue() + 1), Integer.valueOf(
089                        testEntity2.getNumber()));
090            } finally {
091                entityManager.close();
092            }
093    
094        }
095    
096        @Test
097        public void testSequences_AnnotationAtFieldLevel() throws Exception {
098            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
099            assertNotNull(factory);
100    
101            TestEntity2 testEntity1 = new TestEntity2();
102            testEntity1.setName("MyAwesomeTestEntity1");
103    
104            // number in this case is generated from a sequence
105            assertNull(testEntity1.getNumber());
106    
107            EntityManager entityManager = factory.createEntityManager();
108            try {
109                entityManager.persist(testEntity1);
110                assertNotNull(testEntity1.getNumber());
111            } finally {
112                entityManager.close();
113            }
114    
115            TestEntity2 testEntity2 = new TestEntity2();
116            testEntity2.setName("MyAwesomeTestEntity2");
117    
118            assertNull(testEntity2.getNumber());
119    
120            entityManager = factory.createEntityManager();
121            try {
122                // try merge here and make sure it works with that as well
123                testEntity2 = entityManager.merge(testEntity2);
124                assertNotNull(testEntity2.getNumber());
125                assertEquals(Integer.valueOf(Integer.valueOf(testEntity1.getNumber()).intValue() + 1), Integer.valueOf(
126                        testEntity2.getNumber()));
127            } finally {
128                entityManager.close();
129            }
130    
131        }
132    
133        @Test
134        public void testSequences_AnnotationAtFieldLevel_MappedSuperClass() throws Exception {
135            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
136            assertNotNull(factory);
137    
138            TestEntity5 testEntity1 = new TestEntity5();
139            testEntity1.setName("MyAwesomeTestEntity1");
140    
141            // number in this case is generated from a sequence
142            assertNull(testEntity1.getNumber());
143    
144            EntityManager entityManager = factory.createEntityManager();
145            try {
146                entityManager.persist(testEntity1);
147                assertNotNull(testEntity1.getNumber());
148            } finally {
149                entityManager.close();
150            }
151    
152            TestEntity5 testEntity2 = new TestEntity5();
153            testEntity2.setName("MyAwesomeTestEntity2");
154    
155            assertNull(testEntity2.getNumber());
156    
157            entityManager = factory.createEntityManager();
158            try {
159                // try merge here and make sure it works with that as well
160                testEntity2 = entityManager.merge(testEntity2);
161                assertNotNull(testEntity2.getNumber());
162                assertEquals(Integer.valueOf(Integer.valueOf(testEntity1.getNumber()).intValue() + 1), Integer.valueOf(
163                        testEntity2.getNumber()));
164            } finally {
165                entityManager.close();
166            }
167    
168        }
169    
170        @Test
171        public void testSequences_AnnotationAtMethodLevel() throws Exception {
172            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
173            assertNotNull(factory);
174    
175            TestEntity3 testEntity1 = new TestEntity3();
176            testEntity1.setName("MyAwesomeTestEntity1");
177    
178            // number in this case is generated from a sequence
179            assertNull(testEntity1.getNumber());
180    
181            EntityManager entityManager = factory.createEntityManager();
182            try {
183                entityManager.persist(testEntity1);
184                assertNotNull(testEntity1.getNumber());
185            } finally {
186                entityManager.close();
187            }
188    
189            TestEntity3 testEntity2 = new TestEntity3();
190            testEntity2.setName("MyAwesomeTestEntity2");
191    
192            assertNull(testEntity2.getNumber());
193    
194            entityManager = factory.createEntityManager();
195            try {
196                // try merge here and make sure it works with that as well
197                testEntity2 = entityManager.merge(testEntity2);
198                assertNotNull(testEntity2.getNumber());
199                assertEquals(Integer.valueOf(Integer.valueOf(testEntity1.getNumber()).intValue() + 1), Integer.valueOf(
200                        testEntity2.getNumber()));
201            } finally {
202                entityManager.close();
203            }
204    
205        }
206    
207        @Test
208        public void testSequences_MappedSuperClass() throws Exception {
209            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
210            assertNotNull(factory);
211    
212            TestEntity4 testEntity1 = new TestEntity4();
213            testEntity1.setName("MyAwesomeTestEntity1");
214    
215            // number in this case is generated from a sequence
216            assertNull(testEntity1.getNumber());
217    
218            EntityManager entityManager = factory.createEntityManager();
219            try {
220                entityManager.persist(testEntity1);
221                assertNotNull(testEntity1.getNumber());
222            } finally {
223                entityManager.close();
224            }
225    
226            TestEntity4 testEntity2 = new TestEntity4();
227            testEntity2.setName("MyAwesomeTestEntity2");
228    
229            assertNull(testEntity2.getNumber());
230    
231            entityManager = factory.createEntityManager();
232            try {
233                // try merge here and make sure it works with that as well
234                testEntity2 = entityManager.merge(testEntity2);
235                assertNotNull(testEntity2.getNumber());
236                assertEquals(Integer.valueOf(Integer.valueOf(testEntity1.getNumber()).intValue() + 1), Integer.valueOf(
237                        testEntity2.getNumber()));
238            } finally {
239                entityManager.close();
240            }
241    
242        }
243    
244        /**
245         * Simple entity for testing of id generation. Using the TRV_ACCT table because it's available and easy to
246         * map to.
247         */
248        @Entity
249        @Table(name = "TRV_ACCT")
250        @PortableSequenceGenerator(name = "TRVL_ID_SEQ") // sequence name should default to TRVL_ID_SEQ
251        public static class TestEntity extends DataObjectBase {
252    
253            @Id @Column(name = "ACCT_NUM") @GeneratedValue(generator = "TRVL_ID_SEQ")
254            private String number;
255    
256            @Column(name = "ACCT_NAME")
257            private String name;
258    
259            @Column(name = "ACCT_FO_ID")
260            private Long amId;
261    
262            public Long getAmId() {
263                return amId;
264            }
265    
266            public void setAmId(Long amId) {
267                this.amId = amId;
268            }
269    
270            public String getName() {
271                return name;
272            }
273    
274            public void setName(String name) {
275                this.name = name;
276            }
277    
278            public String getNumber() {
279                return number;
280            }
281    
282            public void setNumber(String number) {
283                this.number = number;
284            }
285        }
286    
287        /**
288         * Simple entity for testing of id generation. Using the TRV_ACCT table because it's available and easy to
289         * map to.
290         */
291        @Entity
292        @Table(name = "TRV_ACCT")
293        public static class TestEntity2 extends DataObjectBase {
294    
295            @Id @GeneratedValue(generator = "TRVL_ID_SEQ_2") @PortableSequenceGenerator(name = "TRVL_ID_SEQ_2",
296                    sequenceName = "TRVL_ID_SEQ") @Column(name = "ACCT_NUM")
297            private String number;
298    
299            @Column(name = "ACCT_NAME")
300            private String name;
301    
302            @Column(name = "ACCT_FO_ID")
303            private Long amId;
304    
305            public Long getAmId() {
306                return amId;
307            }
308    
309            public void setAmId(Long amId) {
310                this.amId = amId;
311            }
312    
313            public String getName() {
314                return name;
315            }
316    
317            public void setName(String name) {
318                this.name = name;
319            }
320    
321            public String getNumber() {
322                return number;
323            }
324    
325            public void setNumber(String number) {
326                this.number = number;
327            }
328        }
329    
330        /**
331         * Simple entity for testing of id generation. Using the TRV_ACCT table because it's available and easy to
332         * map to.
333         */
334        @Entity
335        @Table(name = "TRV_ACCT")
336        @Access(AccessType.PROPERTY)
337        public static class TestEntity3 extends DataObjectBase {
338    
339            private String number;
340            private String name;
341            private Long amId;
342    
343            @Column(name = "ACCT_FO_ID")
344            public Long getAmId() {
345                return amId;
346            }
347    
348            public void setAmId(Long amId) {
349                this.amId = amId;
350            }
351    
352            @Column(name = "ACCT_NAME")
353            public String getName() {
354                return name;
355            }
356    
357            public void setName(String name) {
358                this.name = name;
359            }
360    
361            @Id
362            @GeneratedValue(generator = "TRVL_ID_SEQ_3")
363            @PortableSequenceGenerator(name = "TRVL_ID_SEQ_3", sequenceName = "TRVL_ID_SEQ")
364            @Column(name = "ACCT_NUM")
365            public String getNumber() {
366                return number;
367            }
368    
369            public void setNumber(String number) {
370                this.number = number;
371            }
372        }
373    
374        @MappedSuperclass
375        @PortableSequenceGenerator(name = "TRVL_ID_SEQ_4", sequenceName = "TRVL_ID_SEQ", initialValue = 1000)
376        public abstract static class ParentTestEntity extends DataObjectBase {
377    
378            public abstract String getNumber();
379    
380        }
381    
382        @Entity
383        @Table(name = "TRV_ACCT")
384        public static class TestEntity4 extends ParentTestEntity {
385    
386            @Id @GeneratedValue(generator = "TRVL_ID_SEQ_4") @Column(name = "ACCT_NUM")
387            private String number;
388    
389            @Column(name = "ACCT_NAME")
390            private String name;
391    
392            @Column(name = "ACCT_FO_ID")
393            private Long amId;
394    
395            public String getNumber() {
396                return number;
397            }
398    
399            public void setNumber(String number) {
400                this.number = number;
401            }
402    
403            public Long getAmId() {
404                return amId;
405            }
406    
407            public void setAmId(Long amId) {
408                this.amId = amId;
409            }
410    
411            public String getName() {
412                return name;
413            }
414    
415            public void setName(String name) {
416                this.name = name;
417            }
418    
419        }
420    
421        @MappedSuperclass
422        public abstract static class ParentTestEntity2 extends DataObjectBase {
423    
424            @Id @GeneratedValue(generator = "TRVL_ID_SEQ_5") @PortableSequenceGenerator(name = "TRVL_ID_SEQ_5",
425                    sequenceName = "TRVL_ID_SEQ", initialValue = 1000) @Column(name = "ACCT_NUM")
426            private String number;
427    
428            public String getNumber() {
429                return number;
430            }
431    
432            public void setNumber(String number) {
433                this.number = number;
434            }
435    
436        }
437    
438        @Entity
439        @Table(name = "TRV_ACCT")
440        public static class TestEntity5 extends ParentTestEntity2 {
441    
442            @Column(name = "ACCT_NAME")
443            private String name;
444    
445            @Column(name = "ACCT_FO_ID")
446            private Long amId;
447    
448            public Long getAmId() {
449                return amId;
450            }
451    
452            public void setAmId(Long amId) {
453                this.amId = amId;
454            }
455    
456            public String getName() {
457                return name;
458            }
459    
460            public void setName(String name) {
461                this.name = name;
462            }
463    
464        }
465    
466        @Test
467        public void testQueryCustomizerMatch() throws Exception {
468            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
469            assertNotNull(factory);
470    
471            TestEntity6 testEntity1 = new TestEntity6();
472            testEntity1.setName("MyAwesomeTestEntity1");
473    
474            TestRelatedExtension extension = new TestRelatedExtension();
475            extension.setAccountTypeCode("TS");
476    
477            EntityManager entityManager = factory.createEntityManager();
478    
479            try {
480                testEntity1 = new TestEntity6();
481                testEntity1.setName("MyCustomFilter");
482                entityManager.persist(testEntity1);
483                extension.setNumber(testEntity1.getNumber());
484                entityManager.persist(extension);
485                entityManager.flush();
486            } finally {
487                entityManager.close();
488            }
489    
490            //Now confirm that the entity fetch found travel extension
491            try {
492                entityManager = factory.createEntityManager();
493                testEntity1 = entityManager.find(TestEntity6.class, testEntity1.getNumber());
494                assertTrue("Match found for base entity", testEntity1 != null && StringUtils.equals("MyCustomFilter",
495                        testEntity1.getName()));
496                assertTrue("Found matching travel extension that matches", testEntity1.getAccountExtension() != null);
497            } finally {
498                entityManager.close();
499            }
500    
501        }
502    
503        @Test
504        public void testQueryCustomizerNoMatch() throws Exception {
505            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
506            assertNotNull(factory);
507    
508            TestEntity6 testEntity1 = new TestEntity6();
509            testEntity1.setName("MyAwesomeTestEntity1");
510    
511            TestRelatedExtension extension = new TestRelatedExtension();
512            extension.setAccountTypeCode("NM");
513    
514            EntityManager entityManager = factory.createEntityManager();
515    
516            try {
517                testEntity1 = new TestEntity6();
518                testEntity1.setName("MyCustomFilter");
519                entityManager.persist(testEntity1);
520                extension.setNumber(testEntity1.getNumber());
521                entityManager.persist(extension);
522                entityManager.flush();
523            } finally {
524                entityManager.close();
525            }
526    
527            //Now confirm that the entity fetch found travel extension
528            try {
529                entityManager = factory.createEntityManager();
530                testEntity1 = entityManager.find(TestEntity6.class, testEntity1.getNumber());
531                assertTrue("Matched found for base entity", testEntity1 != null && StringUtils.equals("MyCustomFilter",
532                        testEntity1.getName()));
533                assertTrue("No matching travel extension", testEntity1.getAccountExtension() == null);
534            } finally {
535                entityManager.close();
536            }
537    
538        }
539    
540        @Test
541        public void testQueryCustomizerSort() throws Exception {
542            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
543            assertNotNull(factory);
544    
545            TestEntity7 testEntity1 = new TestEntity7();
546            testEntity1.setName("MyAwesomeTestEntity1");
547    
548            TestRelatedExtension2 extension2 = new TestRelatedExtension2();
549            extension2.setAccountTypeCode("ZZ");
550    
551            TestRelatedExtension2 extension = new TestRelatedExtension2();
552            extension.setAccountTypeCode("NM");
553    
554            EntityManager entityManager = factory.createEntityManager();
555    
556            try {
557                testEntity1 = new TestEntity7();
558                testEntity1.setName("MyCustomFilter");
559                entityManager.persist(testEntity1);
560                extension.setNumber(testEntity1.getNumber());
561                entityManager.persist(extension);
562                entityManager.flush();
563            } finally {
564                entityManager.close();
565            }
566    
567            try {
568                entityManager = factory.createEntityManager();
569                extension2.setNumber(testEntity1.getNumber());
570                entityManager.persist(extension2);
571                entityManager.flush();
572            } finally {
573                entityManager.close();
574            }
575    
576            entityManager = factory.createEntityManager();
577    
578            //Now confirm that the entity fetch found travel extension
579            try {
580                entityManager = factory.createEntityManager();
581                testEntity1 = entityManager.find(TestEntity7.class, testEntity1.getNumber());
582                assertTrue("Matched found for base entity", testEntity1 != null && StringUtils.equals("MyCustomFilter",
583                        testEntity1.getName()));
584                assertTrue("Fetching 2 extensions",
585                        testEntity1.getAccountExtension() != null && testEntity1.getAccountExtension().size() == 2);
586                assertTrue("Fetched ZZ extension first ", StringUtils.equals(testEntity1.getAccountExtension().get(0)
587                        .getAccountTypeCode(), "ZZ"));
588            } finally {
589                entityManager.close();
590            }
591    
592        }
593    
594        @Test
595        public void testQueryCustomizerValueClass() throws Exception {
596            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
597            assertNotNull(factory);
598    
599            TestEntity8 testEntity1 = new TestEntity8();
600            testEntity1.setName("MyAwesomeTestEntity1");
601    
602            TestRelatedExtension extension = new TestRelatedExtension();
603            extension.setAccountTypeCode("NM");
604    
605            EntityManager entityManager = factory.createEntityManager();
606    
607            try {
608                testEntity1 = new TestEntity8();
609                testEntity1.setName("MyCustomFilter");
610                entityManager.persist(testEntity1);
611                extension.setNumber(testEntity1.getNumber());
612                entityManager.persist(extension);
613                entityManager.flush();
614            } finally {
615                entityManager.close();
616            }
617    
618            //Now confirm that the entity fetch found travel extension
619            try {
620                entityManager = factory.createEntityManager();
621                testEntity1 = entityManager.find(TestEntity8.class, testEntity1.getNumber());
622                assertTrue("Matched found for base entity", testEntity1 != null && StringUtils.equals("MyCustomFilter",
623                        testEntity1.getName()));
624                assertTrue("Matching travel extension", testEntity1.getAccountExtension() == null);
625            } finally {
626                entityManager.close();
627            }
628    
629        }
630    
631        @Test
632        public void testQueryCustomizerNoMatchMultipleCustomizers() throws Exception {
633            EntityManagerFactory factory = (EntityManagerFactory) context.getBean("entityManagerFactory");
634            assertNotNull(factory);
635    
636            TestEntity9 testEntity1 = new TestEntity9();
637            testEntity1.setName("MyAwesomeTestEntity1");
638    
639            TestRelatedExtension extension = new TestRelatedExtension();
640            extension.setAccountTypeCode("TS");
641    
642            EntityManager entityManager = factory.createEntityManager();
643    
644            try {
645                testEntity1 = new TestEntity9();
646                testEntity1.setName("MyCustomFilter");
647                entityManager.persist(testEntity1);
648                extension.setNumber(testEntity1.getNumber());
649                entityManager.persist(extension);
650                entityManager.flush();
651            } finally {
652                entityManager.close();
653            }
654    
655            //Now confirm that the entity fetch found travel extension
656            try {
657                entityManager = factory.createEntityManager();
658                testEntity1 = entityManager.find(TestEntity9.class, testEntity1.getNumber());
659                assertTrue("Match found for base entity", testEntity1 != null && StringUtils.equals("MyCustomFilter",
660                        testEntity1.getName()));
661                assertTrue("Found no travel extension that matches", testEntity1.getAccountExtension() == null);
662            } finally {
663                entityManager.close();
664            }
665    
666        }
667    
668        @Entity
669        @Table(name = "TRV_ACCT")
670        public static class TestEntity6 extends ParentTestEntity2 {
671    
672            @ManyToOne(targetEntity = TestRelatedExtension.class, fetch = FetchType.EAGER) @JoinColumn(name = "ACCT_NUM",
673                    insertable = false, updatable = false) @FilterGenerator(attributeName = "accountTypeCode",
674                    attributeValue = "TS")
675            private TestRelatedExtension accountExtension;
676    
677            @Column(name = "ACCT_NAME")
678            private String name;
679    
680            @Column(name = "ACCT_FO_ID")
681            private Long amId;
682    
683            public Long getAmId() {
684                return amId;
685            }
686    
687            public void setAmId(Long amId) {
688                this.amId = amId;
689            }
690    
691            public String getName() {
692                return name;
693            }
694    
695            public void setName(String name) {
696                this.name = name;
697            }
698    
699            public TestRelatedExtension getAccountExtension() {
700                return accountExtension;
701            }
702    
703            public void setAccountExtension(TestRelatedExtension accountExtension) {
704                this.accountExtension = accountExtension;
705            }
706        }
707    
708        @Entity
709        @Table(name = "TRV_ACCT_EXT")
710        @ExtensionFor(SimpleAccount.class)
711        public static class TestRelatedExtension extends DataObjectBase {
712    
713            @Id @Column(name = "ACCT_NUM")
714            private String number;
715            @Column(name = "ACCT_TYPE")
716            private String accountTypeCode;
717    
718            public String getNumber() {
719                return number;
720            }
721    
722            public void setNumber(String number) {
723                this.number = number;
724            }
725    
726            public String getAccountTypeCode() {
727                return accountTypeCode;
728            }
729    
730            public void setAccountTypeCode(String accountTypeCode) {
731                this.accountTypeCode = accountTypeCode;
732            }
733        }
734    
735        @Entity
736        @Table(name = "TRV_ACCT")
737        public static class TestEntity7 extends ParentTestEntity2 {
738    
739            @OneToMany(targetEntity = TestRelatedExtension2.class, fetch = FetchType.EAGER) @JoinColumn(
740                    name = "ACCT_NUM") @OrderBy("accountTypeCode DESC")
741            private List<TestRelatedExtension2> accountExtension = new ArrayList<TestRelatedExtension2>();
742    
743            @Column(name = "ACCT_NAME")
744            private String name;
745    
746            @Column(name = "ACCT_FO_ID")
747            private Long amId;
748    
749            public Long getAmId() {
750                return amId;
751            }
752    
753            public void setAmId(Long amId) {
754                this.amId = amId;
755            }
756    
757            public String getName() {
758                return name;
759            }
760    
761            public void setName(String name) {
762                this.name = name;
763            }
764    
765            public List<TestRelatedExtension2> getAccountExtension() {
766                return accountExtension;
767            }
768    
769            public void setAccountExtension(List<TestRelatedExtension2> accountExtension) {
770                this.accountExtension = accountExtension;
771            }
772    
773        }
774    
775        @Entity
776        @Table(name = "TRV_ACCT_EXT")
777        public static class TestRelatedExtension2 extends DataObjectBase {
778    
779            @Id @Column(name = "ACCT_NUM")
780            private String number;
781            @Id @Column(name = "ACCT_TYPE")
782            private String accountTypeCode;
783    
784            @ManyToOne(targetEntity = TestEntity7.class, fetch = FetchType.EAGER) @JoinColumn(name = "ACCT_NUM",
785                    insertable = false, updatable = false)
786            private TestEntity7 testEntity7;
787    
788            public String getNumber() {
789                return number;
790            }
791    
792            public void setNumber(String number) {
793                this.number = number;
794            }
795    
796            public String getAccountTypeCode() {
797                return accountTypeCode;
798            }
799    
800            public void setAccountTypeCode(String accountTypeCode) {
801                this.accountTypeCode = accountTypeCode;
802            }
803    
804            public TestEntity7 getTestEntity7() {
805                return testEntity7;
806            }
807    
808            public void setTestEntity7(TestEntity7 testEntity7) {
809                this.testEntity7 = testEntity7;
810            }
811        }
812    
813        @Entity
814        @Table(name = "TRV_ACCT")
815        public static class TestEntity8 extends ParentTestEntity2 {
816    
817            @ManyToOne(targetEntity = TestRelatedExtension.class, fetch = FetchType.EAGER) @JoinColumn(name = "ACCT_NUM",
818                    insertable = false, updatable = false) @FilterGenerator(attributeName = "accountTypeCode",
819                    attributeResolverClass = org.kuali.rice.krad.data.jpa.testbo.TestQueryCustomizerValue.class)
820            private TestRelatedExtension accountExtension;
821    
822            @Column(name = "ACCT_NAME")
823            private String name;
824    
825            @Column(name = "ACCT_FO_ID")
826            private Long amId;
827    
828            public Long getAmId() {
829                return amId;
830            }
831    
832            public void setAmId(Long amId) {
833                this.amId = amId;
834            }
835    
836            public String getName() {
837                return name;
838            }
839    
840            public void setName(String name) {
841                this.name = name;
842            }
843    
844            public TestRelatedExtension getAccountExtension() {
845                return accountExtension;
846            }
847    
848            public void setAccountExtension(TestRelatedExtension accountExtension) {
849                this.accountExtension = accountExtension;
850            }
851        }
852    
853        @Entity
854        @Table(name = "TRV_ACCT")
855        public static class TestEntity9 extends ParentTestEntity2 {
856    
857            @ManyToOne(targetEntity = TestRelatedExtension.class, fetch = FetchType.EAGER) @JoinColumn(name = "ACCT_NUM",
858                    insertable = false, updatable = false)
859            @FilterGenerators({
860            @FilterGenerator(attributeName = "accountTypeCode",attributeValue = "TS"),
861            @FilterGenerator(attributeName = "accountTypeCode",attributeValue = "NM")})
862            private TestRelatedExtension accountExtension;
863    
864            @Column(name = "ACCT_NAME")
865            private String name;
866    
867            @Column(name = "ACCT_FO_ID")
868            private Long amId;
869    
870            public Long getAmId() {
871                return amId;
872            }
873    
874            public void setAmId(Long amId) {
875                this.amId = amId;
876            }
877    
878            public String getName() {
879                return name;
880            }
881    
882            public void setName(String name) {
883                this.name = name;
884            }
885    
886            public TestRelatedExtension getAccountExtension() {
887                return accountExtension;
888            }
889    
890            public void setAccountExtension(TestRelatedExtension accountExtension) {
891                this.accountExtension = accountExtension;
892            }
893        }
894    
895    }