2017-07-12 18 views
0

こんにちは私は現在Hibernateを学んでおり、私はアドレスから自宅の住所と事務所の住所に列名を変更しようとしているところで問題に固執しています。私はすべてのオフィスアドレスコードをコメントアウトしましたが、データベースの列はまだ "CITY_NAME"、 "STREET_NAME"などです。JavaのHibernateのattributeoverrideアノテーションが機能していませんか?

ありがとう、ありがとうございます。

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; 
    } 


} 

これはこれは、休止状態SessionAttributeOverride機能をサポートしているか、いない場合、私はあなたを伝えることはできませんドライバクラス

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

どのようなhbm2ddl値を使用しますか? –

+0

@AurelienEcotoここは<プロパティ名= "hibernate.hbm2ddl.auto">作成 - ドロップ – EricMA

+0

このプロパティはどのファイルに定義されていますか? '私はすべてのオフィスアドレスコードをコメントアウトしましたが、データベースの列...':コードを実行する前に古いテーブルを削除しましたか? – ujulu

答えて

0

ある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; 
    } 

} 

です。問題は、私が思うに、Hibernateは同じ問題を解決しようとしている2つの異なるテクノロジーを混在させており、それは新しいユーザーが習得しようとすると混乱します。

  • レガシー(ネイティブ)ORMとして使用することができ、休止状態
  • JPA(Javaの永続API)の実装、私はあなたがJPAのアノテーションを使用している、あなたの投稿のコード例からわかるよう

javax.persistenceのパッケージ構造を持つすべての注釈、クラスおよびプロパティは、JPA固有のものです。だから私のアドバイスは、永続性をHibernateやJPAのやり方で設定し、混同しないようにすることです。

あなたは、あなたのエンティティJPAの道をマッピング次の操作を実行したい場合:

  • あなたの構成情報がファイルpersistence.xmlではなく、hibernate.cfg.xmlに入れてください。ファイルは、ソースディレクトリのMETA-INFフォルダの下にある必要があります。 Mavenを使用している場合は、src/main/resources/META-INFディレクトリに置きます。ファイルには、次のようになります。

    <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> 
    

正しいデータベース情報を...を交換してください。あなたのテストクラス(HibernateTest)で

  • ではなくSessionFactory/Sessionの次の操作を行います

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

    あなたも読むことができます:

  • Hibernate User Guide

  • Java Persistence API Tutorials
  • JPA 2.1 Specification

うまくいけば、助けてください。

関連する問題