我从@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>


有人有主意吗?

感谢帮助

最佳答案

这肯定是有问题的:

<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中讨论过了。

07-24 09:47
查看更多