【已解决】persistence.xml和entity类不在同一jar包,导致找不到实体

问题描述:

JPA会自动读取同一jar包下,标注@Entity的实体类。但是如果所使用的实体和persistent.xml不在同一jar包时,会读取不到,而导致IllegalArgumentException: Not an managed type: class foo.bar


解决方案1:

在persistence.xml明确指定需要被JPA管理的实体。如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit transaction-type="RESOURCE_LOCAL" name="persistenceUnit">
        <class>foo.bar1</class>
        <class>foo.bar2</class>
    </persistence-unit>
</persistence>


这种方法的缺点很明显。既然是persistence.xml和entity类,那么项目就肯定是分成了多个模块,或者是运行测试用例。但是要想找到实体,仍然需要集中修改persistence.xml。这样并不是真正的模块化,还需集中处理各个业务对象。


解决方案2:

使用Spring管理JPA。在3.0以上的版本中(具体忘了是3.0.几开始支持的了),用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,配置packagesToScan属性,Spring会自动扫描并加载该包及其子包下所有的@Entity。

以前一直知道这个方法,但是每次试都不起作用,怀疑是Spring的一个BUG。今天静下心来读了一下这块的源码,发现如果要让这个属性起作用,就一定不能配置persistenceXmlLocation属性。persistenceXmlLocation用来指定persistence.xml的位置,如果指定这个属性,Spring就不会完全托管JPA。现在,删除这个属性,就意味着可以把persistence.xml文件也一并删掉了。

配置示例:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="${base.package.name}" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
	<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
	    p:showSql="true" 
	    p:generateDdl="true" 
	    p:databasePlatform="${database.platform}" 
	/>
    </property>
</bean>



转载于:https://my.oschina.net/u/719192/blog/173640

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值