2011-12-17 13 views
0

私はintellijとnewを使用して冬眠しています。分岐テーブル用のクラスを作成し、私は例外を取得実行中:id, institute_id, street_id, name自動的にクラスを生成するときに、期待されるセカンダリテーブルが見つかりません

  • 分岐テーブルには、次の列が含まれています。
    idは、スーパーテーブルへの外部キーです(同じIDシーケンスを共有する2つのテーブルがあります)。
    institute_idは、テーブルを作成するための外部キーです。
    street_idは、ストリートテーブルへの外部キーです。
  • のIntelliJで作成された支店のクラスがある:これは私が実行コードがある

    @Entity 
    public class Branch { 
    private long id; 
    
    @javax.persistence.Column(name = "id", nullable = false, insertable = true, updatable = true, length = 19, precision = 0) 
    @Id 
    public long getId() { 
        return id; 
    } 
    
    public void setId(long id) { 
        this.id = id; 
    } 
    
    private long instituteId; 
    
    @javax.persistence.Column(name = "institute_id", nullable = false, insertable = true, updatable = true, length = 19, precision = 0) 
    @Basic 
    public long getInstituteId() { 
        return instituteId; 
    } 
    
    public void setInstituteId(long instituteId) { 
        this.instituteId = instituteId; 
    } 
    
    private long streetId; 
    
    @javax.persistence.Column(name = "street_id", nullable = true, insertable = true, updatable = true, length = 19, precision = 0) 
    @Basic 
    public long getStreetId() { 
        return streetId; 
    } 
    
    public void setStreetId(long streetId) { 
        this.streetId = streetId; 
    } 
    
    private String name; 
    
    @javax.persistence.Column(name = "name", nullable = false, insertable = true, updatable = true, length = 50, precision = 0) 
    @Basic 
    public String getName() { 
        return name; 
    } 
    
    public void setName(String name) { 
        this.name = name; 
    } 
    
    @Override 
    public boolean equals(Object o) { 
        if (this == o) return true; 
        if (o == null || getClass() != o.getClass()) return false; 
    
        Branch branch = (Branch) o; 
    
        if (id != branch.id) return false; 
        if (instituteId != branch.instituteId) return false; 
        if (streetId != branch.streetId) return false; 
        if (name != null ? !name.equals(branch.name) : branch.name != null) return false; 
    
        return true; 
    } 
    
    @Override 
    public int hashCode() { 
        int result = (int) (id^(id >>> 32)); 
        result = 31 * result + (int) (instituteId^(instituteId >>> 32)); 
        result = 31 * result + (int) (streetId^(streetId >>> 32)); 
        result = 31 * result + (name != null ? name.hashCode() : 0); 
        return result; 
    } 
    
    private Institute instituteByInstituteId; 
    
    @ManyToOne 
    public 
    @javax.persistence.JoinColumn(name = "institute_id", referencedColumnName = "id", nullable = false, table = "branch") 
    Institute getInstituteByInstituteId() { 
        return instituteByInstituteId; 
    } 
    
    public void setInstituteByInstituteId(Institute instituteByInstituteId) { 
        this.instituteByInstituteId = instituteByInstituteId; 
    } 
    
    private Street streetByStreetId; 
    
    @ManyToOne 
    public 
    @javax.persistence.JoinColumn(name = "street_id", referencedColumnName = "id", table = "branch") 
    Street getStreetByStreetId() { 
        return streetByStreetId; 
    } 
    
    public void setStreetByStreetId(Street streetByStreetId) { 
        this.streetByStreetId = streetByStreetId; 
    } 
    } 
    
  • (IntelliJのは、これを自動的に作成):

    public static void main(final String[] args) throws Exception { 
        final Session session = getSession(); 
        try { 
         System.out.println("querying all the managed entities..."); 
         final Map metadataMap = session.getSessionFactory().getAllClassMetadata(); 
         for (Object key : metadataMap.keySet()) { 
          final ClassMetadata classMetadata = (ClassMetadata) metadataMap.get(key); 
          final String entityName = classMetadata.getEntityName(); 
          final Query query = session.createQuery("from " + entityName); 
          System.out.println("executing: " + query.getQueryString()); 
          for (Object o : query.list()) { 
           System.out.println(" " + o); 
          } 
         } 
        } finally { 
         session.close(); 
        } 
    } 
    
  • 私は次の例外だ:

    org.hibernate.AnnotationException: Cannot find the expected secondary table: no branch available for GreenWheels.Data.Entities.Branch 
    

UPDATE
エンティティごとにxmlでエンティティを生成すると、ブランチに対して次のxmlが作成され、現在は機能します。それはどうですか?

Branch.nbm.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"> 
<hibernate-mapping> 

    <class name="GreenWheels.Data.Entities.Branch" table="branch" catalog="greenwheels"> 
     <id name="id"> 
      <column name="id" sql-type="bigint" length="19" not-null="true"/> 
     </id> 
     <property name="instituteId"> 
      <column name="institute_id" sql-type="bigint" length="19" not-null="true"/> 
     </property> 
     <property name="streetId"> 
      <column name="street_id" sql-type="bigint" length="19"/> 
     </property> 
     <property name="name"> 
      <column name="name" sql-type="varchar" length="50" not-null="true"/> 
     </property> 
     <many-to-one name="instituteByInstituteId" class="GreenWheels.Data.Entities.Institute"> 
      <column name="institute_id" not-null="true"/> 
     </many-to-one> 
     <many-to-one name="streetByStreetId" class="GreenWheels.Data.Entities.Street"> 
      <column name="street_id"/> 
     </many-to-one> 
    </class> 
</hibernate-mapping> 

答えて

1

生成されるクラスが正しくありません。私はメッセージの意味を正確にはわかりませんが、確かにエンティティが正しくマップされていないことがわかります:institute_idは、1回はColumn、もう一度はJoinColumnと2回マッピングされます。 streetIdと同じです。また、必要のない属性も追加します。ここでは、クラスは次のようになります方法は次のとおりです。

@Entity 
public class Branch { 
private long id; 

@Column(name = "id", nullable = false, length = 19, precision = 0) 
@Id 
public long getId() { 
    return id; 
} 

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

private String name; 

@Column(name = "name", nullable = false, length = 50) 
public String getName() { 
    return name; 
} 

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

private Institute institute; 

@ManyToOne 
@JoinColumn(name = "institute_id", nullable = false) 
public Institute getInstitute() { 
    return institute; 
} 

public void setInstitute(Institute institute) { 
    this.institute = institute; 
} 

private Street street; 

@ManyToOne 
@JoinColumn(name = "street_id") 
public Street getStreet() { 
    return street; 
} 

public void setStreet(Street street) { 
    this.street = street; 
} 
} 

私の推測では、エラーがJoinColumn注釈のtable = "branch"属性によって呼び出されるということです。

+0

これは機能しません。この例外はまだ発生します。アップデートをご覧ください。 – Naor

+0

この解決策は私のために働いた。このようなManyToOne関係をマッピングすると、 '@ JoinColumn'エントリに加えて、外部キーの' @ Column'エントリがありました。私は '@ Column'を冗長にして削除しただけです。 – scottyseus

関連する問題