开发者

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on <entity> references an unknown entity

I am receiving the following Hibernate Exception:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on cz.rohan.dusps.model.Switchport.konfiguracniTemplateAccess references an unknown entity: cz.rohan.dusps.model.KonfiguracniTemplate
    org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
    org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
    org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
    org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
    org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
    org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
    cz.rohan.dusps.helper.Sessi开发者_开发问答onFactoryHelper.initFactory(SessionFactoryHelper.java:122)
    cz.rohan.dusps.helper.SessionFactoryHelper.getSessionFactory(SessionFactoryHelper.java:134)
    cz.rohan.dusps.filter.HistorieZmenFilter.doFilter(HistorieZmenFilter.java:102)
    cz.rohan.dusps.filter.CharsetFilter.doFilter(CharsetFilter.java:41)

after ~20 hours spent on the problem with various people, having read every possible blog or forum, I am really getting desperate here.

This is a mid-sized project. I should mention the database is Postgres 9.1 and we generate the DB using a modelling tool. Hibernate connects to the database but does not generate it.

I have created a new entity in the database, it's called "KonfiguracniTemplate" (configuration template). I have created the model, controller, form, validators, .jsp's, all basically copied 1:1 from an existing entity of a similar nature. I can now work with KonfiguracniTemplate, CRUD is fully working.

The problem comes when I reference this KonfiguracniTemplate from the entity called Switchport. In the DB there is a relation between the two:

  • Switchport 1:1 ... 0:N KonfiguracniTemplate (switchport always references a KonfiguracniTemplate; a KonfiguracniTemplate MAY BE referenced zero or more times)
  • Switchport has FK konfiguracniTemplateAccess_id for this relation.

In .../model/Switchport.java the relation is mapped just like all other relations that are working:

@ManyToOne
@JoinColumn(nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

I have tried various forms:

@ManyToOne
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

or

@ManyToOne(targetEntity=KonfiguracniTemplate.class)
@JoinColumn(name="konfiguracnitemplateaccess_id", nullable = false)
private KonfiguracniTemplate konfiguracniTemplateAccess;

I have also checked:

  • both entities are in the same package
  • they are both annotated "@Entity" using "import javax.persistence.Entity;"
  • the build produces no error/warning messages
  • as long as the reference in Switchport is commented out, everything is fine

No matter what I try I cannot get rid of the "references an unknown entity" exception. Can somebody please share an idea what is happening or maybe how to debug the issue? The stacktrace at the top of the post is all I get in the logs.

All input is greatly appreciated!


Just add the class Team to the "hibernate-cfg.xml" file, because Hibernate doesn't identify without adding into it.


Possible Solutions:

1) Ensure that the entity has been appropriately referenced in hibernate.cfg.xml

<hibernate-configuration>
<session-factory>
    ... 
    <mapping class="com.project.entitytwo.model.EntityTwo"/>
    ...
</session-factory>

2) Ensure that @Entity has been specified at the class-level ( at the top of the class )

@Entity
@Table( name="ENTITY_TWO" )
public class EntityTwo extends AnyClass
{
    ...


I just had this problem, with entity a referencing entity b. Both entities were located in a common JAR outside of the web project I was working on; a was declared in persistence.xml but b wasn't. I put b in a <class> tag in persistence.xml and it worked!


I ran into this problem when using Spring and not using the hibernate.cfg.xml file. It was solved by adding the fully qualified package name of the Model class to the setPackagesToScan method of LocalSessionFactoryBean class.


Finally got the solution from another developer on the team!

The classes need to be imported before the SessionFactory object is created. Here the import for the new class was missing, so it was unknown to the SessionFactory object.

Anyway, thanks everyone for your hints!


There is one more chance of getting such exception; when you don't mention your mapping class in hibernate.cfg.xml file. As mentioned above.


I had same exception... I just forget add annotation (@Entity, and @Table) on MASTER class(class with Primary key)

so solution is double check every annotation in your entities , I mean not only @ManyToOne and @OneToMany like i did.


if your two entity in diffrent project,you can scan KonfiguracniTemplate's package in other project.you can do like this in spring boot

@EntityScan({"com.thispackage.entity","com.KonfiguracniTemplatepackage.entity"})


I'll give you a solution that should work for the same error with Spring Boot. This has less to do with the original question, but today, people would probably look for this answer instead because noone uses XML configuration today anymore.

I suffered the same problem and found the solution on this website: https://www.programmersought.com/article/1617314625/

He even describes this very question he would have looked up, but then I'm asking myself: why didn't he answered here after finding the solution? LOL

His own words:

In the Spring Boot project, the default scan package is the package where the main method is located, that is, only the entity classes in the same package as the main method will be discovered. This way you can understand why User is not found: because User is an entity class in another module. Spring Boot does not scan other packages at all; Configure the @SpringBootApplication annotation on the main method that launches the application, telling Spring Boot that those packages need to be scanned: @SpringBootApplication(scanBasePackages = {“com.xiaomo.*”}) Then, User can be found.

So you basically reconfigure SpringBoot to scan more packages to include the other ones.

My personal addition: you could also move your packages into the package where the starter is located or move the starter a package up (that's what I did).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜