2017-04-03 50 views
0

我有一个场景,休眠类中的Embeddable类使用Entity。根据我在SO和其他链接上找到的各种答案,我们可以在Embeddable类中写入@ManyToOne, @OneToMany嵌入式内部多对一关系,休眠

但是这样做让我HibernateMappingExeption

请看下面的例子: 我有两个实体和一个可嵌入类如下:

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

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

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

嵌入类,它使用实体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

I已经改变了我的答案。你能看出你是否遵循了同样的事情? –

+0

这个工程!谢谢。但是为什么我们需要添加'(cascade = CascadeType.ALL)',我不明白这个 – OutOfMind