2016-11-15 12 views
0

私は冬眠するのが初めてです。私は注釈付きエンティティクラスからデータベーステーブルを生成しようとしています。

Tagクラス:これらを使用して、

package util; 

import org.hibernate.SessionFactory; 
import org.hibernate.boot.MetadataSources; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.service.ServiceRegistry; 

import playground.data.entities.Tag; 

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      Configuration config = new Configuration(); 
      //config.addAnnotatedClass(Tag.class); //<-- tried this too 
      return config.configure().buildSessionFactory(); 

      // Also tried the following. 
      // ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); 

      // return new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); 

     } catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    public static void shutdown() { 
     // Close caches and connection pools 
     getSessionFactory().close(); 
    } 

} 

最後に:ここで

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
     <property name="hibernate.connection.password">1234</property> 
     <property name="hibernate.connection.url">jdbc:sqlserver://localhost;database=HibernatePlayground;SelectMethod=cursor</property> 
     <property name="hibernate.connection.username">sa</property> 
     <property name="hibernate.default_schema">dbo</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property> 
     <property name="hibernate.hbm2ddl.auto">update</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <mapping class="playground.data.entities.Tag" /> 
    </session-factory> 
</hibernate-configuration> 

は私のHibernateUtilクラス(:http://www.mkyong.com/hibernate/maven-3-hibernate-3-6-oracle-11g-example-xml-mapping/http://www.mkyong.com/hibernate/maven-3-hibernate-3-6-oracle-11g-example-annotation/参照)である:ここでは

package playground.data.entities; 

import java.time.Instant; 
import javax.persistence.*; 

@Entity 
public class Tag extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    public long Id; 

    @Column(unique = true, nullable = false) 
    public String Name; 

    @Column(nullable = false) 
    public Instant CreatedOn; 
} 

は私hibernate.cfg.xmlですからメイン:

package playground; 

import java.time.Instant; 

import org.hibernate.Session; 

import playground.data.entities.Tag; 
import util.HibernateUtil; 

public class Main { 

    public static void main(String[] args) { 

     Tag tag1 = new Tag() { 
      { 
       Name = "Tag1"; 
       CreatedOn = Instant.now(); 
      } 
     }; 
     Tag tag2 = new Tag(){ 
      { 
       Name = "Tag2"; 
       CreatedOn = Instant.now(); 
      } 
     }; 
     Session ss = HibernateUtil.getSessionFactory().openSession(); 
     ss.beginTransaction(); 
     // saving objects to session 
     ss.save(tag1); //<-- getting error here. 
     ss.save(tag2); 
     ss.getTransaction().commit(); 
     HibernateUtil.shutdown(); 
    } 
} 

しかしsavetag1オブジェクトをINGの一方で、私はException in thread "main" org.hibernate.MappingException: Unknown entity: playground.Main$1を取得しています。以下は 休止状態からのログに記録された情報と一緒にフルスタックトレースです:


Nov 15, 2016 11:42:59 AM org.hibernate.Version logVersion 
INFO: HHH000412: Hibernate Core {5.2.4.Final} 
Nov 15, 2016 11:42:59 AM org.hibernate.cfg.Environment 
INFO: HHH000206: hibernate.properties not found 
Nov 15, 2016 11:42:59 AM org.hibernate.cfg.Environment buildBytecodeProvider 
INFO: HHH000021: Bytecode provider name : javassist 
Nov 15, 2016 11:43:00 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager 
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 
Nov 15, 2016 11:43:00 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure 
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) 
Nov 15, 2016 11:43:00 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH10001005: using driver [com.microsoft.sqlserver.jdbc.SQLServerDriver] at URL [jdbc:sqlserver://localhost;database=HibernatePlayground;SelectMethod=cursor] 
Nov 15, 2016 11:43:00 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH10001001: Connection properties: {user=sa, password=****} 
Nov 15, 2016 11:43:00 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator 
INFO: HHH10001003: Autocommit mode: false 
Nov 15, 2016 11:43:00 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections 
INFO: HHH000115: Hibernate connection pool size: 20 (min=1) 
Nov 15, 2016 11:43:00 AM org.hibernate.dialect.Dialect 
INFO: HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect 
Nov 15, 2016 11:43:02 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection 
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.[email protected]10c626be] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. 
Exception in thread "main" org.hibernate.MappingException: Unknown entity: playground.Main$1 
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1605) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:674) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:666) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:661) 
    at playground.Main.main(Main.java:85) 

私が使用しています:

  • をするJava 1.8は、休止状態:5.2
  • データベースサーバー:SQL Serverの2016
  • OSをWindows 10
  • IDE:Eclipse IDEネオン(4.6.0)
次のように

マイプロジェクト構造は次のとおりです。

project structure

それはMainためMappingExceptionを投げている理由は、私はわかりません。提案してください。

答えて

3

次のようにすると、メンバ変数を初期化するインスタンス初期化子を使用して、エンティティクラスTagの匿名サブクラスを作成しています。これはTagエンティティを作成し、初期化する正しい方法ではありません。

代わり
Tag tag1 = new Tag() { 
    { 
     Name = "Tag1"; 
     CreatedOn = Instant.now(); 
    } 
}; 

、クラスTag自体のインスタンスを作成し、値を設定します。

Tag tag1 = new Tag(); 
tag1.Name = "Tag1"; 
tag1.CreatedOn = Instant.now(); 

をしかし、このコードでより多くの間違ってあります。 Tagのフィールドはpublicでなく、privateである必要があります。また、getterメソッドとsetterメソッドをクラスTagに追加する必要があります。また、Javaのフィールド名は、通常、小文字で始まる名前を持つ必要があります。

@Entity 
public class Tag extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private long id; 

    @Column(unique = true, nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private Instant createdOn; 

    public String getName() { 
     return name; 
    } 

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

    public Instant getCreatedOn() { 
     return createdOn; 
    } 

    public void setCreatedOn(Instant createdOn) { 
     this.createdOn = createdOn; 
    } 
} 

そして、それを初期化します

Tag tag1 = new Tag(); 
tag1.setName("Tag1"); 
tag1.setCreatedOn(Instant.now()); 
関連する問題