2017-07-12 2 views
0

Hallo Ich lerne derzeit Hibernate und ich bin auf ein Problem fest, wo ich versuche, den Spaltennamen von Adresse zu Privatadresse und Büroadresse zu überschreiben. Ich habe alle Office-Adresse Code auskommentiert, aber die Spalte in der Datenbank sind immer noch "CITY_NAME", "STREET_NAME" und etc.Java-Hibernate-Attributoverride-Annotation funktioniert nicht?

Könnte jemand bitte dies erklären, danke.

Address.java

package org.zm.javabrain.dto; 

import javax.persistence.Column; 
import javax.persistence.Embeddable; 

@Embeddable 
public class Address { 
    @Column(name="STREET_NAME") 
    private String stree; 
    @Column(name="CITY_NAME") 
    private String city; 
    @Column(name="STATE_NAME") 
    private String state; 
    @Column(name="ZIP_NAME") 
    private String zip; 
    public String getStree() { 
     return stree; 
    } 
    public void setStree(String stree) { 
     this.stree = stree; 
    } 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    public String getState() { 
     return state; 
    } 
    public void setState(String state) { 
     this.state = state; 
    } 
    public String getZip() { 
     return zip; 
    } 
    public void setZip(String zip) { 
     this.zip = zip; 
    } 


} 

dies UserDetails.java

package org.zm.javabrain.dto; 

import java.io.Serializable; 
import java.util.Date; 

import javax.persistence.AttributeOverride; 
import javax.persistence.AttributeOverrides; 
import javax.persistence.Basic; 
import javax.persistence.Column; 
import javax.persistence.Embedded; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Lob; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.Transient; 

@Entity // change the name of the entity 
@Table(name="USER_DETAILS") // change the name of the table 
public class UserDetails implements Serializable { 

    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private int userId; 
    private String username; 
    private Date joinedDate; 
    private String description; 

    @Embedded 
    @AttributeOverrides({ 
    @AttributeOverride(name="street",[email protected](name="HOME_STREET_NAME")), 
    @AttributeOverride(name="city",[email protected](name="HOME_CITY_NAME")), 
    @AttributeOverride(name="state",[email protected](name="HOME_STATE_NAME")), 
    @AttributeOverride(name="zip",[email protected](name="HOME_ZIP_NAME"))}) 
    private Address homeAddress; 

// @Embedded 
// @AttributeOverrides({ 
//  @AttributeOverride(name="street",[email protected](name="OFFICE_STREET_NAME")), 
//  @AttributeOverride(name="city",[email protected](name="OFFICE_CITY_NAME")), 
//  @AttributeOverride(name="state",[email protected](name="OFFICE_STATE_NAME")), 
//  @AttributeOverride(name="zip",[email protected](name="OFFICE_ZIP_NAME"))}) 
// private Address officeAddress; 
// 
// public Address getOfficeAddress() { 
//  return officeAddress; 
// } 
// public void setOfficeAddress(Address officeAddress) { 
//  this.officeAddress = officeAddress; 
// } 
    public Date getJoinedDate() { 
     return joinedDate; 
    } 
    public void setJoinedDate(Date joinedDate) { 
     this.joinedDate = joinedDate; 
    } 

    public Address getHomeAddress() { 
     return homeAddress; 
    } 
    public void setHomeAddress(Address homeAddress) { 
     this.homeAddress = homeAddress; 
    } 
    public String getDescription() { 
     return description; 
    } 
    public void setDescription(String description) { 
     this.description = description; 
    } 
    public int getUserId() { 
     return userId; 
    } 
    public void setUserId(int userId) { 
     this.userId = userId; 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 

} 

Dies ist Treiberklasse

package org.zm.hibernate; 

import java.util.Date; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 
import org.zm.javabrain.dto.Address; 
import org.zm.javabrain.dto.UserDetails; 

public class HibernateTest { 

    public static void main(String[] args) { 

     UserDetails user = new UserDetails(); 

     Address addr = new Address(); 
     addr.setCity("chicago"); 
     addr.setState("IL"); 
     addr.setStree("Michigen Ave"); 
     addr.setZip("55414"); 

     Address officeAddr = new Address(); 
     officeAddr.setCity("minneapolis"); 
     officeAddr.setState("Washington Ave"); 
     officeAddr.setState("MN"); 
     officeAddr.setZip("55455"); 

     user.setUsername("11111"); 
     user.setHomeAddress(addr); 
//  user.setOfficeAddress(officeAddr); 
     user.setJoinedDate(new Date()); 
     user.setDescription("this is a description"); 

     SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     session.beginTransaction(); 
     session.save(user); 
     session.getTransaction().commit(); 
     session.close(); 
    } 
} 
+0

Welchen hbm2ddl-Wert verwenden Sie? –

+0

@AurelienEcoto hier ist es create-drop – EricMA

+0

In welcher Datei ist diese Eigenschaft definiert? 'Ich habe den ganzen Büro-Adress-Code auskommentiert, aber die Spalte in der Datenbank ...': Haben Sie die alten Tabellen fallen gelassen, bevor Sie Ihren Code ausgeführt haben? – ujulu

Antwort

0

Ich kann Ihnen nicht sagen, ob Hibernate Session die unterstützt AttributeOverride Funktion oder nicht . Das Problem ist, denke ich, Hibernate ist Mischen von zwei verschiedenen Technologien, die versuchen, das gleiche Problem zu lösen, und das ist verwirrend für neue Benutzer versuchen zu lernen. Hibernate kann als

  • Legacy (Muttersprache) ORM verwendet werden, und
  • JPA (Java Persistence API) Implementierung

Als ich von Ihrem geposteten Code Beispiel sehen kann, die Sie JPA Annotationen verwenden. Alle Anmerkungen, Klassen und Eigenschaften mit der Paketstruktur sind JPA-spezifisch. Also mein Rat ist, entweder deine Persistenz auf den Hibernate-Weg oder den JPA-Weg zu konfigurieren, und nicht mischen.

Wenn Sie Ihre Einheiten, die die PPV Weg abzubilden, gehen Sie wie folgt vor:

  • Setzen Sie Ihre Konfigurationsinformationen in der Datei persistence.xml statt im hibernate.cfg.xml. Die Datei sollte unter META-INF Ordner Ihres Quellverzeichnisses sein. Wenn Sie Maven verwenden, setzen Sie es unter src/main/resources/META-INF Verzeichnis. Die Datei sollte wie folgt aussehen:

    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
        version="2.1"> 
    
        <persistence-unit name="yourPU" transaction-type="RESOURCE_LOCAL"> 
         <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
         <class>org.zm.javabrain.dto.UserDetails</class> 
    
         <properties> 
          <property name="javax.persistence.jdbc.driver" value="..." /> 
          <property name="javax.persistence.jdbc.url" value="..." /> 
          <property name="javax.persistence.jdbc.user" value="..." /> 
          <property name="javax.persistence.jdbc.password" value="..." /> 
    
          <property name="hibernate.show_sql" value="true" /> 
          <property name="hibernate.hbm2ddl.auto" value="create-drop" /> 
         </properties> 
    
        </persistence-unit> 
    
    </persistence> 
    

die ... mit der richtigen Datenbankinformationen ersetzen.

  • In Ihrer Testklasse (HibernateTest) Sie wie folgt statt SessionFactory/Session:

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("yourPU"); 
    EntityManager em = emf.createEntityManager(); 
    em.getTransaction().begin(); 
    em.persist(user); 
    em.getTransaction().commit; 
    em.close(); 
    emf.close(); 
    

    Sie können auch lesen:

  • Hibernate User Guide

  • Java Persistence API Tutorials
  • JPA 2.1 Specification

Hoffentlich hilft es.

Verwandte Themen