2016-08-02 16 views
0

Derzeit habe ich gerade Hibernate gestartet. Ich bin ein wenig verwirrt, warum @Column Annotation nicht auf Getter arbeiten. Wie ich weiß, funktioniert es auf Feldern und Getter, aber nicht auf Setter. Was mache ich falsch?@Column Annotation funktioniert nicht

@Entity (name="USER_DETAILS") 
public class UserDetails { 

    @Id 
    private int userId; 

    private String userName; 

    public int getUserId() { 
     return userId; 
    } 

    public void setUserId(int userId) { 
     this.userId = userId; 
    } 

    @Column (name="USER_NAME") 

    public String getUserName() { 
     return userName + " from name getter"; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 
} 

Weder userName Spaltenwechsel in der Datenbank noch "from name getter" anhängt in seinen Wert ..

Hier ist meine Hauptklasse:

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    UserDetails user=new UserDetails(); 
    user.setUserId(1); 
    user.setUserName("First User"); 
    SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory(); 
    Session session=sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(user); 
    session.getTransaction().commit(); 
    session.close(); 
} 

Antwort

0

Soweit ich weiß, Sie hibernate.cfg Config festlegen müssen sagen, überwache alle Eigenschaften wie Datenquelle und Zuordnungen. Zu Beginn des Hauptverfahrens konfigurieren etwas wie folgt aus:

Configuration config = new Configuration().configure("hibernate.cfg.xml"); 
    StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder(); 
    srb.applySettings(config.getProperties()); 
    ServiceRegistry registry = srb.build(); 
    SessionFactory sessionFactory = config.buildSessionFactory(registry); 

Und Ihre cfg.xml wäre so etwas wie:

<!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">YOUR_DRIVER</property> 
     <property name="hibernate.connection.username">YOUR_USER</property> 
     <property name="hibernate.connection.password">YOUR_PASSWPRD</property> 
     <property name="hibernate.connection.url"> YOUR_URL </property> 
     <property name="hibernate.dialect">SET_YOUR_DIALECT</property> 
     <property name="hibernate.hbm2ddl.auto">update</property> 
     <!-- Map Entity Class --> 
    <mapping class="entity.UserDetails"></mapping> 

</session-factory> 
</hibernate-configuration> 
0

Das Problem Sie konfrontiert sind durch den gemischten Zugriffsmodi verursacht das gleiche Wesen. Wenn Sie den Zugriffsmodus mischen wollen, müssen Sie die folgenden Schritte tun:

  1. den Standardzugriffsmodus wie folgt definieren:

    @Entity 
    @Access(AccessType.FIELD) 
    public class UserDetails { ...} 
    

Damit die Standard-Zugriffsmodus Einstellung gesetzt Feldzugriff. Wenn Sie dies nicht tun und Felder sowie Eigenschaften mit den Mapping-Annotationen (z. B. @Column) annotieren, ist das Verhalten nicht definiert.

  1. nun mit Anmerkungen versehen, die die Getter-Methode für den Zugriff auf Eigenschaften explizit (dh die Persistenz-Provider zu sagen, dass ich meine Standard definiert haben Feldzugriff zu sein, aber in diesem Fall möchte ich nutzen Immobilien-Zugang):

    @Access(AccessType.PROPERTY) 
    @Column (name="USER_NAME") 
    public String getUserName() { 
        return userName+" from name getter"; 
    } 
    
  2. Und schließlich das entsprechende Feld als vorübergehende Verwendung @Transient Anmerkung markieren, so dass sich der Anbieter nicht den Zustand anhalten wird versuchen, das Feld als auch die Eigenschaft zu verwenden:

    @Transient private String userName; 
    

Hinweis: Wenn es keinen gültigen Grund für die Verwendung des gemischten Modus gibt, sollten Sie entweder mit dem Feldzugriffsmodus oder mit dem Eigenschaftszugriffsmodus fortfahren. Verwenden Sie nicht beide Modi in einer Entität, da Sie sauberen und verständlichen Code schreiben möchten! (Meine persönliche Meinung)

Und eine letzte Bemerkung in der folgenden Zeile im Code:

@Entity (name="USER_DETAILS") 

Falls Sie sich mit name Attribute bewusst für das Unternehmen zu benennen es kein Problem sein könnte; Wenn Sie jedoch versuchen, die Entität einer Tabelle namens USER_DETAILS zuzuordnen, ist dies nicht der richtige Weg. Verwenden Sie stattdessen Folgendes:

@Table(name = "USER_DETAILS") 
Verwandte Themen