我有以下课程:
public abstract class AbstractFoo
{
public virtual int Id { get; set; }
}
public class Foo : AbstractFoo
{
public virtual string MyProp {get; set; }
}
我在我的hibernate映射文件中表示它:
<class name="AbstractFoo">
<id name="Id">
<generator class="native" />
</id>
<discriminator column="FooType" type="String" />
<subclass name="Foo" discriminator-value="MoveFile">
<property name="MyProp" />
</subclass>
</class>
从这一点来看,它运作正常。
我想要做的是将子类中的每个属性存储为元数据。我的意思是我想序列化它并将其存储为xml,因此我可以拥有所需的子类,而不需要每个子表,也没有很多不会使用的列。
感谢。
答案 0 :(得分:0)
<subclass name="Foo" discriminator-value="MoveFile">
<property name="SerialisedProps" column="serialisedProps" access="Name.Space.FakeAccessor, Asse" />
</subclass>
class FakeAccessor : IPropertyAccessor, IGetter, ISetter
{
public IGetter GetGetter(string name)
{
return this;
}
public ISetter GetSetter(string name)
{
return this;
}
public bool CanAccessThroughReflectionOptimizer { get { return false; } }
public object Get(object target)
{
return Serialize(target);
}
object GetForInsert(object owner, IDictionary mergeMap, ISessionImplementor session)
{
return Get(owner);
}
public void Set(object target, object value)
{
// deserialize xml and set appropriate properties
}
Type ReturnType { get { return typeof(string); } }
string PropertyName { get { return "SerialisedProps"; } }
private string Serialize(object subclass)
{
// example implementation
var type = subclass.GetType();
var root = new XElement(type.Name);
foreach (var prop in type.GetProperties())
{
root.Add(new XElement("property", new XAttribute("name", prop.name), new XAttribute("value", prop.GetValue(subclass, null) + ""));
}
return root.ToString();
}
}