无法从实体类 Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 创建表

Posted

技术标签:

【中文标题】无法从实体类 Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 创建表【英文标题】:Can't create table from Entity class Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 【发布时间】:2015-09-12 09:25:57 【问题描述】:

我在自动从@Entity 类创建表时遇到问题。当我手动创建表时,一切正常。我可以注入 entityManager 等等。我找到了很多像this 这样的解决方案,但对我不起作用。我的配置: persistence.xml

    <persistence-unit name="entityManagerFactory"
    transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jdbc/oracleTest</jta-data-source>
    <class>pl.example.was.test.entity.ResourceEntity</class>

    <properties>
        <property name="packagesToScan" value="pl.example.was.test.entity" />
        <property name="hibernate.archive.autodetection" value="class, hbm" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop" />
        <property name="show_sql" value="true" />
        <property name="format_sql" value="true" />
        <property name="hibernate.hbm2ddl.auto" value="true" />

        <property name="hibernate.transaction.factory_class"
            value="org.hibernate.transaction.CMTTransactionFactory" />
        <property name="hibernate.transaction.manager_lookup_class"
            value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
    </properties>
</persistence-unit>

实体类的一部分

@Entity
 public class ResourceEntity implements Serializable 

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;
// getters setters //

注入EntityManager

@PersistenceContext
private EntityManager em;

我正在创建两个测试方法

public void addResource(ResourceEntity selectedResource, Locale locale) 
    selectedResource.setLocale(locale.toString());
    try
    Session session = em.unwrap(Session.class);
    Transaction tx = session.beginTransaction();
    session.save(selectedResource);
    session.flush();
    session.clear();
    tx.commit();
    session.close();
    catch (Exception ex)
        ex.printStackTrace();
    

public void addResource2(ResourceEntity selectedResource, Locale locale) 
    selectedResource.setLocale(locale.toString());
    em.persist(selectedResource);

我读到我必须在自动创建表之后创建Session 对象或EntityManager,但在我的情况下不是。 我的休眠依赖项

<dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.2.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.7.Final</version>
    </dependency>

有人知道吗?

感谢您的帮助

【问题讨论】:

具体的问题是什么?运行代码时是否获得堆栈跟踪?如果是这样,请发布堆栈跟踪。 不,我没有堆栈跟踪。应用程序正常运行,但未在数据库中创建表。当我想保存 ResourceEntity 对象时,我有一个信息:table or view does not exist 因为没有创建表。这个信息很清楚,但我不知道为什么。 Hibernate 应该自动创建表 【参考方案1】:

这个肯定有问题:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

您要求 Hibernate 在会话结束时删除模式。这就是为什么你最终没有桌子。您可能想要的是:

<property name="hibernate.hbm2ddl.auto" value="create" />

此外,true 不是hibernate.hbm2ddl.auto 的有效值,所以最好删除它:

<property name="hibernate.hbm2ddl.auto" value="true" />

这已经在here讨论过。

【讨论】:

以上是关于无法从实体类 Hibernate 4.2.7 Websphere 8.5.5 oracle 11g 创建表的主要内容,如果未能解决你的问题,请参考以下文章

eclipse从数据库逆向生成Hibernate实体类

eclipse逆向生成hibernate的实体类

Hibernate 根据实体类自动生成表问题

hibernate的反转引擎生成两个实体类的问题

从 JPA/Hibernate 中的视图加载实体

《Java从入门到放弃》入门篇:使用注解的方式配置hibernate映射关系