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