2017-04-03 25 views
0

私は、休止状態のEmbeddableクラスがEntityを使用するシナリオを持っています。私がSOやその他のリンクで見つけた様々な答えによると、は、クラスの中に@ManyToOne, @OneToManyと書くことができます。Embeddable、Hibernate内の多対1の関係

エンティティA

@Entity 
@Table(name = "A") 
public class A { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int a_id; 

    @ElementCollection 
    @JoinTable(name = "embeded_class_table", joinColumns = @JoinColumn(name = "a_id")) 
    private List<EmbeddedClass> embeddedClass; 

エンティティB:私は下のように2つのエンティティおよび埋め込みクラスを持っている :

しかし、これは私にHibernateMappingExeption

を与えることは、次の例を考えてみましょう

エンティティB

@Embeddable 
public class EmbeddableClass { 

    @ManyToOne 
    @JoinColumn(name = "b_id") 
    private B b; 

私は取得していますエラーが下のようである使用しています

埋め込みクラス:私は正しく、はい場合は、これらのものを使用していた場合

org.hibernate.MappingException: Could not determine type for: app.model.B, at table: embeded_class_table, for columns: [org.hibernate.mapping.Column(b)] 

は誰が提案してくださいでしたが、私は何が欠けていますか?

答えて

1

私はすべての問題を取得していない、私は次のことを試してみました、あなたのシナリオを想定すると:これは動作しませんでした

@Entity 
@Table(name = "A") 
public class A { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int a_id; 

    @ElementCollection 
    @JoinTable(name = "embeded_class_table", joinColumns = @JoinColumn(name = "a_id")) 
    private List<EmbeddableClass> embeddedClass; 

    public int getA_id() { 
     return a_id; 
    } 

    public void setA_id(int a_id) { 
     this.a_id = a_id; 
    } 

    public List<EmbeddableClass> getEmbeddedClass() { 
     return embeddedClass; 
    } 

    public void setEmbeddedClass(List<EmbeddableClass> embeddedClass) { 
     this.embeddedClass = embeddedClass; 
    } 

} 

@Entity 
@Table(name = "B") 
public class B { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int b_id; 
} 

@Embeddable 
public class EmbeddableClass { 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "b_id") 
    private B b; 

    public B getB() { 
     return b; 
    } 

    public void setB(B b) { 
     this.b = b; 
    } 


} 

hibernate.cfg.xmlの

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
     <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
     <property name="hibernate.connection.password">xxxx</property> 
     <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> 
     <property name="hibernate.connection.username">elias</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> 
     <property name="hibernate.hbm2ddl.auto">create-drop</property> 
     <property name="show_sql">true</property> 
     <mapping class="com.springex.dto.A"></mapping> 
     <mapping class="com.springex.dto.B"></mapping> 
     <mapping class="com.springex.dto.EmbeddableClass"></mapping> 
    </session-factory> 
</hibernate-configuration> 
+0

、私は問題が関係していると思います'EnbeddableClass'と' Entity B'は例外として次のように書かれています: '型:app.model.B、テーブル:embeded_class_table、カラム:[org.hibernate.mapping.Column(b)]' – OutOfMind

+0

私の答えが変わった。あなたは同じことを続けましたか? –

+0

これは動作します!ありがとう。しかし、どうして私は '(cascade = CascadeType.ALL)'を追加する必要があるのですか?私はこれを理解していません。 – OutOfMind