Frage

Ich möchte Hibernate verwenden (ORM) zusammen mit Hibernate Validator. Innerhalb der Dokumentation können wir folgendes finden:

  

Aus dem Kasten heraus, Hibernate Annotations   (Stand: Hibernate 3.5.x) wird übersetzen   die Einschränkungen, die Sie definiert haben   Ihre Entitäten in Mapping-Metadaten.   Wenn zum Beispiel eine Eigenschaft Ihrer   Entität @NotNull kommentiert, sein   Spalten werden als nicht für nichtig erklärt werden,   in dem DDL-Schema erzeugt durch   Hibernate.

Und das ist mein Code:

Test / MyClass.java

public class MyClass implements Serializable
{
    private long id;
    @Length(max=36)
    @NotNull
    private String myString;

    public MyClass() {};

    public MyClass(String myString)
    {
        this.myString = myString;
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getMyString()
    {
        return myString;
    }

    public void setMyString(String myString)
    {
        this.myString = myString;
    }   
}

Test / MyClass.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2010-08-02 21:13:04 by Hibernate Tools 3.3.0.GA -->
<hibernate-mapping>
    <class name="test.MyClass" table="my_table" >
        <id name="id" type="long" unsaved-value="0">
            <column name="id" />
            <generator class="native"/>
        </id>
        <property name="myString" type="string">
            <column name="my_string"/>
        </property>
    </class>
</hibernate-mapping>

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/htest</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">root</property>
  <property name="hibernate.hbm2ddl.auto">update</property>  
  <property name="hibernate.show_sql">true</property>


  <!-- Mapping files -->
  <mapping resource="test/myClass.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

und schließlich: Test.java

public class Test
{
    public static void main(String[] args)
    {                       
        Session session = null;
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        MyClass str1 = null;
        Transaction tx = null;
        try 
        {
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            str1 = new MyClass("hello");
            session.save(str1);
            tx.commit();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally 
        {
            session.close();
        }   
    }
}

Also, ich würde erwarten, dass die Spalte myString eine Länge von 36 haben würde, aber es hat 255 (Standard) und wäre nicht null, aber es ist null (Standardeinstellung).

Die Konsole druckt die folgenden:

16:35:46,641  INFO SchemaUpdate:155 - Running hbm2ddl schema update
16:35:46,642  INFO SchemaUpdate:167 - fetching database metadata
16:35:46,644  INFO SchemaUpdate:179 - updating schema
16:35:46,647  INFO DatabaseMetadata:119 - table not found: my_table
16:35:46,649  INFO DatabaseMetadata:119 - table not found: my_table
16:35:46,650 DEBUG SchemaUpdate:203 - create table my_table (id bigint not null auto_increment, my_string varchar(255), primary key (id))
16:35:46,755  INFO SchemaUpdate:217 - schema update complete
16:35:46,793 DEBUG SQL:111 - insert into my_table (my_string) values (?)
Hibernate: insert into my_table (my_string) values (?)

Versionen: Hibernate-Verteilung-3.5.4-final-dist und Hibernate-Validator-4.1.0.Final-dist

Hat jemand sehe etwas falsch in meinem Code? Irgendwelche Ideen?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Nun, Sie verwenden nicht Anmerkungen. Statt:

SessionFactory sessionFactory = new Configuration()
    .configure()
    .buildSessionFactory();

Versuchen Sie:

SessionFactory sessionFactory = new AnnotationConfiguration()
    .configure()
    .buildSessionFactory();

Ich persönlich würde voll bewegen Anmerkungen heißt auch Annotationen verwenden Entitäten abzubilden (eigentlich würde ich voll und ganz zu JPA 2.0 bewegen und die EntityManager API verwenden). Aber die oben sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top