2016-07-19 12 views
0

私は、ユーザー定義データ型のセットを使用する(古い)既存のMSSQLデータベースを使用しています。あなたは、MSSQLデータベースにこれらの文を適用することにより、使用して私の状況を再作成することができます、私は、JBoss EAP 6.4.7サーバーで休止状態を使用しているためアクセスこのデータベースでHibernateのMSSQLユーザー定義データ型(列の欠落の例外)

CREATE TYPE [dbo].[T_MyCustomType] FROM [varchar](10) NOT NULL 
GO 

CREATE TABLE [dbo].[MyTable](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [dbo].[T_MyCustomType] NULL, 
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED ([ID] ASC)) 
GO 

。次のエンティティクラスは、このために使用することができます。

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "MyTable") 
public class CustomTypeTest { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int ID; 

    @Column(name = "Name") 
    private String name; 


    public int getID() { 
     return ID; 
    } 

    public void setID(int iD) { 
     ID = iD; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

私は@Column(name = "Name)注釈が必要ではないが、私は正しい列が使用されていることを確認するためにこれを追加して、同じ問題がこの注釈なしで表示されていることを実感します。

完全性については

が、これは私が使用しているpersistence.xmlのです:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Persistence deployment descriptor for dev profile --> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
      version="1.0"> 
    <persistence-unit name="MyDatabase-MSSQL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/mssql/MyDatabase</jta-data-source>  
     <class>com.example.CustomTypeTest</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.format_sql" value="false" /> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 
      <property name="hibernate.cache.use_second_level_cache" value="true"/> 
      <property name="hibernate.cache.region.factory_class" value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory"/> 
      <property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/container/hibernate"/>  
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> 
      <property name="hibernate.cache.use_query_cache" value="true"/> 
      <property name="hibernate.jdbc.batch_size" value="100"/> 
     </properties>  
    </persistence-unit> 
</persistence> 

私はJBossサーバを起動すると、私は次のエラーを取得する:私が変更した場合

javax.persistence.PersistenceException: [PersistenceUnit: main-db-MSSql] Unable to build EntityManagerFactory 
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:103) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_65] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_65] 
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_65] 
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.2.Final-redhat-1.jar:2.1.2.Final-redhat-1] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit:main-db-MSSql]] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:925) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:900) 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:76) 
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:200) 
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$600(PersistenceUnitServiceImpl.java:57) 
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:99) 
    ... 4 more 
Caused by: org.hibernate.HibernateException: Missing column: Name in MyDatabase.dbo.MyTable 
    at org.hibernate.mapping.Table.validateColumns(Table.java:366) 
    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1307) 
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:175) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:514) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1854) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:96) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) 
    ... 9 more 

Name列のデータ型はMyTableから標準varchar(10)になります。ただし、これは既存のデータベースでは不可能です。

提示されたセットアップが動作するように、MSSQLのユーザ定義データ型を休止状態にマップする方法はありますか?

答えて

0

@ Column#columnDefinition注釈が必要な場合もあります。

または、これらのカスタムタイプ(またはその両方)のデータベースのユーザー/ロールにVIEW DEFINITIONを付与する必要があります。

+0

私の例では、これはnameカラムの定義を次のように変更することを意味します: '@Column(name =" Name "、columnDefinition =" T_MyCustomType ")プライベートString name;' "View definition" SQLサーバのカスタムタイプに必要です。これは、SQLサーバ管理スタジオで「MyDatabase> Security> User/Roles'にナビゲートし、ユーザ/ロールを右クリックし、「securables」タブに移動して検索を押し、「すべてのオブジェクトを選択」することで簡単に行うことができます。 .. "を選択し、"ユーザー定義のデータ型 "を選択し、T_MyCustomTypeを見つけて、ビュー定義許可を与えます。 – Immortaly007

関連する問題