3
有人在Hibernate論壇上提出這個問題,我在這裏鏈接到它,因爲我有同樣的問題。似乎沒有人在那裏有任何幫助,所以我希望這可能更有用。使用Hibernate持久保存一個超類型的一對多列表
這就是:
感謝。
有人在Hibernate論壇上提出這個問題,我在這裏鏈接到它,因爲我有同樣的問題。似乎沒有人在那裏有任何幫助,所以我希望這可能更有用。使用Hibernate持久保存一個超類型的一對多列表
這就是:
感謝。
有趣。這裏不用我做了什麼
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();
}
都工作得不錯!
你說得對。問題是,如果您使用每個具體類映射策略的表,則不能擁有超類的列表。這個每層次的表適用於這個問題。謝謝。 – NickDK 2010-06-29 19:42:01
你試過了什麼?使用註釋或XML映射? – 2010-06-28 20:16:47
我正在使用像這個人在他的問題中所做的XML映射。 – NickDK 2010-06-28 20:24:48