[hibernate-issues] [Hibernate-JIRA] Resolved: (METAGEN-35) Generated meta model classes does not extend the super class' meta model.

Hardy Ferentschik (JIRA) noreply at atlassian.com
Wed Oct 6 07:17:57 EDT 2010


     [ http://opensource.atlassian.com/projects/hibernate/browse/METAGEN-35?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Hardy Ferentschik resolved METAGEN-35.
--------------------------------------

    Resolution: Fixed

> Generated meta model classes does not extend the super class' meta model.
> -------------------------------------------------------------------------
>
>                 Key: METAGEN-35
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/METAGEN-35
>             Project: Hibernate Metamodel Generator
>          Issue Type: Bug
>          Components: processor
>    Affects Versions: 1.0.0.Final
>         Environment: Maven 2.2.1, Hibernate 3.5.4, maven-processor-plugin 13.6
>            Reporter: Joel Ringuette
>            Assignee: Hardy Ferentschik
>             Fix For: 1.1.0
>
>
> I'm currently using maven to build a project. I'm using org.bsc.maven.maven-processor-plugin plugin to generate the meta model. In my main source folder, I have a class annotated with @MappedSuperclass.
> {code}
> @MappedSuperclass
> public abstract class BaseEntity
> {
>     // Entity id
>     @Id
>     @GeneratedValue
>     private Long id;
>     // some more code
> }
> {code}
> In my test source folder, I have a class extending BaseEntity annotated with @Entity
> {code}
> @Entity()
> public class Book extends BaseEntity
> {
>     private String name;
>     @Column(unique = true)
>     private String isbn;
>     @ManyToOne(optional = false)
>     private Author author;
>     
>     // some more code
> }
> {code}
> When generating the meta model, the BaseEntity will generate BaseEntity_ and Book will generate Book_. The problem is that Book_ does not extend BaseEntity_
> Here is my config of the plugin
> {code:xml} 
> <plugin>
>     <groupId>org.bsc.maven</groupId>
>     <artifactId>maven-processor-plugin</artifactId>
>     <version>1.3.6</version>
>     <executions>
>         <execution>
>             <id>process</id>
>             <goals>
>                 <goal>process</goal>
>             </goals>
>             <phase>generate-sources</phase>
>             <configuration>
>                 <!-- source output directory -->
>                 <outputDirectory>${project.build.sourceDirectory}</outputDirectory>
>             </configuration>
>         </execution>
>         <execution>
>             <id>process-test</id>
>             <goals>
>                 <goal>process-test</goal>
>             </goals>
>             <phase>generate-test-sources</phase>
>             <configuration>
>                 <!-- source output directory -->
>                 <outputDirectory>${project.build.testSourceDirectory}</outputDirectory>
>                 <compilerArguments>-Adebug=true</compilerArguments>
>             </configuration>
>         </execution>
>     </executions>
>     <dependencies>
>         <dependency>
>             <groupId>org.hibernate</groupId>
>             <artifactId>hibernate-jpamodelgen</artifactId>
>             <version>1.0.0.Final-Genia</version>
>             <scope>compile</scope>
>         </dependency>
>     </dependencies>
> </plugin>
> {code} 
> After looking at the code, the culprit seem to be org.hibernate.jpamodelgen.ClassWriter. In the method printClassDeclaration, we can see the following code:
> {code}
> if ( context.containsMetaEntity( superClassName )
>         || context.containsMetaEmbeddable( superClassName ) ) {
>     pw.print( " extends " + superClassName + "_" );
> }
> {code}
> It assume the the super class meta model is generated at the same time as the extending class, which is not the case for test-compile and compile. I also assume that it does not work if you extend a class coming from a jar where the meta model was already generated.
> To locally fix the problem, I changed the above code for:
> {code}
> if (((TypeElement) superClassElement).getAnnotation(Entity.class) != null
>         || ((TypeElement) superClassElement).getAnnotation(MappedSuperclass.class) != null)
> {
>     pw.print(" extends " + superClassName + "_");
> }
> {code}
> Since it's the first time I use annotation for code generation, I may not have fully understood the problem so feel free to correct me if the above fix is not the correct solution.
> Regard,
> Joel

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list