2010-06-28 40 views

回答

2

有趣。這裏不用我做了什麼

package br.com.ar.model.domain.Parent; 

@Entity 
public class Parent implements Serializable { 

    private Integer id; 

    private AbstractChild[] childArray; 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 

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

    @OneToMany 
    @IndexColumn(name="CHILD_INDEX", nullable=false) 
    @JoinColumn(name="PARENT_ID", nullable=false) 
    @Cascade(CascadeType.SAVE_UPDATE) 
    public AbstractChild[] getChildArray() { 
     return childArray; 
    } 

    public void setChildArray(AbstractChild[] childArray) { 
     this.childArray = childArray; 
    } 

} 

現在我們的AbstractChild的陣列(你確定你定義了你AbstractChild(在這裏,它起着Book類的角色)作爲抽象 ???

package br.com.ar.model.domain; 

@Entity 
/** 
    * I am using InheritanceType.SINGLE_TABLE instead of TABLE_PER_CLASS 
    * Because MySQL (DB used) DOES NOT SUPPORT identity generation strategy 
    * Otherwise, i will get some Exception 
    */ 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
    name="BILLING_DETAILS_TYPE", 
    discriminatorType=DiscriminatorType.STRING 
) 
/** 
    * ARE YOU SURE your Book class HAS BEEN MARKED AS abstract 
    */ 
public abstract class AbstractChild implements Serializable { 

    private Integer id; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Integer getId() { 
     return id; 
    } 

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

} 

mapping.hbm.xml(類路徑的根目錄)

<hibernate-mapping> 
    <class name="br.com.ar.model.domain.AbstractChild" abstract="true"> 
    <id column="id" name="id" type="integer"> 
     <generator class="native"/> 
    </id> 
    <discriminator column="BILLING_DETAILS_TYPE" type="string"/> 
    <subclass name="br.com.ar.model.domain.Child" discriminator-value="CC"> 
     <property name="someProperty" type="string"/> 
    </subclass> 
    <!--I CAN NOT USE union-subclass because MySQL does not support DB identity generation strategy--> 
    <!--union-subclass name="br.com.ar.model.domain.Child"> 
     <property name="someProperty" type="string"/> 
    </union-subclass--> 
    </class> 
    <class name="br.com.ar.model.domain.Parent"> 
    <id column="id" name="id" type="integer"> 
     <generator class="native"/> 
    </id> 
    <array name="childArray" cascade="all"> 
     <key column="PARENT_ID"/> 
     <index column="SORT_ORDER"/> 
     <one-to-many class="br.com.ar.model.domain.AbstractChild"/> 
    </array> 
    </class> 
</hibernate-mapping> 

現在讓我們來測試

隨着

@Test 
public void doWithAnnotations() { 

    AnnotationConfiguration configuration = new AnnotationConfiguration(); 

    SessionFactory sessionFactory = configuration 

     .addAnnotatedClass(Parent.class) 
     .addAnnotatedClass(Child.class) 
     .addAnnotatedClass(AbstractChild.class) 
     .setProperty(Environment.DRIVER, "com.mysql.jdbc.Driver") 
     .setProperty(Environment.URL, "jdbc:mysql://127.0.0.1:3306/ar") 
     .setProperty(Environment.USER, "root") 
     .setProperty(Environment.PASS, "root") 
     .setProperty(Environment.SHOW_SQL, "true") 
     .setProperty(Environment.FORMAT_SQL, "true") 
     .setProperty(Environment.DIALECT, "org.hibernate.dialect.MySQLDialect") 
     .setProperty(Environment.HBM2DDL_AUTO, "create-drop").buildSessionFactory(); 

    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 

    Parent parent = new Parent(); 
    parent.setChildArray(new AbstractChild[] {new Child("AAA"), new Child("BBB")}); 

    session.save(parent); 

    session.getTransaction().commit(); 
    session.close(); 
} 

而且沒有

@Test 
public void doWithoutAnnotations() { 

    Configuration configuration = new Configuration().configure(); 

    SessionFactory sessionFactory = configuration.buildSessionFactory(); 

    Session session = sessionFactory.openSession(); 
    session.beginTransaction(); 

    Parent parent = new Parent(); 
    parent.setChildArray(new AbstractChild[] {new Child("AAA"), new Child("BBB")}); 

    session.save(parent); 

    session.getTransaction().commit(); 
    session.close(); 
} 

都工作得不錯!

+0

你說得對。問題是,如果您使用每個具體類映射策略的表,則不能擁有超類的列表。這個每層次的表適用於這個問題。謝謝。 – NickDK 2010-06-29 19:42:01

相關問題