【问题标题】:Hibernate : All tables in SQL Server database are not auto-created休眠:SQL Server 数据库中的所有表都不是自动创建的
【发布时间】:2018-03-26 13:52:24
【问题描述】:

在 Microsoft SQL Server 2012 上的数据库中从 Java 创建表。所有表都已创建,除了一个表。我正在使用 JPA,并且有我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="teknikPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/teknikNDataSource</jta-data-source>
    <class>com.royken.entities.Bloc</class>
    <class>com.royken.entities.Elements</class>
    <class>com.royken.entities.Organes</class>
    <class>com.royken.entities.SousOrganes</class>
    <class>com.royken.entities.Utilisateurs</class>
    <class>com.royken.entities.Zone</class>
    <class>com.royken.entities.Reponse</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="eclipselink.ddl-generation" value="create-or-extend-tables"/>
      <property name="eclipselink.logging.level" value="OFF"/>
      <property name="eclipselink.cache.shared.default" value="false"/>
      <property name="eclipselink.query-results-cache" value="false"/>
      <!--            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.SunOneJtaPlatform" />
            <property name="hibernate.transaction.factory_class" value="org.hibernate.engine.transaction.internal.jta.JtaTransactionFactory"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.classloading.use_current_tccl_as_parent" value="false"/>-->
      <!--<property name="javax.persistence.schema-generation.database.action" value="create"/> -->
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>

这就是我定义我的类的方式:

@Entity
@XmlRootElement(name = "elements")
@Table(name = "ELEMENTS")
@XmlAccessorType(XmlAccessType.FIELD)
public class Elements implements Serializable {

    private static final long serialVersionUID = 1L;
    @OneToMany(mappedBy = "elements")
    private List<Reponse> reponses;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Version
    @Column(name = "VERSION")
    private int version;

    @Column(name = "NOM")
    private String nom;

    @Column(columnDefinition = "tinyint(1) default true", name = "HASBORNS")
    private boolean hasBorns;

    @Column(columnDefinition = "tinyint(1) default true", name = "CRITERIAALPHA")
    private boolean criteriaAlpha;

}

我已经定义了 7 个这样的表,但是只创建了 6 个表,没有创建 Elements 表。当我使用 mysql 数据库更改数据源时(不更改任何代码部分),我的所有表都创建得很好。 可能是什么问题? 下图显示了 SQL Server 中的结果,Elements 表不存在。

【问题讨论】:

    标签: java sql-server hibernate glassfish-4 jpa-2.1


    【解决方案1】:

    在您的persistence.xml 中使用:

    <property name="eclipselink.deploy-on-startup" value="true" />
    

    在您的代码中,您可以使用:

    import javax.ejb.Stateless;
    import entity.userEntity;
    import javax.persistence.EntityManager;
    import javax.persistence.NoResultException;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;
    

    寻找实体管理器

     @PersistenceContext
                private EntityManager entityManager;
    

    然后像这样使用它:

    Query query = entityManager.createQuery("SELECT e FROM Elements e WHERE e.id= :idValue");
                query.setParameter("idValue", 1);
                Elements elements = null;
                try {
                    elements = (Elements) query.getSingleResult();
    } catch (NoResultException ex) {
                    ex.printStackTrace();
                }
    

    您可以参考this

    如果这也无济于事,请看here

    【讨论】:

    • 你好@Surajit,我试过了,但它不起作用。 06 个表是自动创建的,一个不是。在 MySQL 上,所有表都是使用相同的代码自动创建的。
    【解决方案2】:

    我找到了解决问题的方法。未创建实体表,因为 SQL Server 不接受 true 作为 hasbornscriteriaalpha 的默认值。此外,它现在没有分配给 tinyint 类型的大小。所以它在创建表的过程中会抛出一个错误。为了解决这个问题,我替换了:

    @Column(columnDefinition = "tinyint(1) default true", name = "HASBORNS")
    private boolean hasBorns;
    
    @Column(columnDefinition = "tinyint(1) default true", name = "CRITERIAALPHA")
    private boolean criteriaAlpha;
    

    与:

    @Column(columnDefinition = "BIT default 1", name = "HASBORNS", length = 1)
    private boolean hasBorns ;
    
    @Column(columnDefinition = "BIT default 1", name = "CRITERIAALPHA", length = 1)
    private boolean criteriaAlpha ;
    

    成功了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多