如何坚持一个非实体
我试图将一个实体扩展到一个用于填充超类字段的非实体。 问题是,当我尝试保存它时,Hibernate会抛出一个MappingException。 这是因为即使我将ReportParser投影到Report,运行时实例仍然是ReportParser,因此Hibernate抱怨它是未知的实体。
@Entity
@Table(name = "TB_Reports")
public class Report
{
Long id;
String name;
String value;
@Id
@GeneratedValue
@Column(name = "cReportID")
public Long getId()
{
return this.id;
}
public void setId(Long id)
{
this.id = id;
}
@Column(name = "cCompanyName")
public String getname()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
@Column(name = "cCompanyValue")
public String getValue()
{
return this.name;
}
public void setValue(String value)
{
this.value = value;
}
}
ReportParser仅用于填写字段。
public class ReportParser extends report
{
public void setName(String htmlstring)
{
...
}
public void setValue(String htmlstring)
{
...
}
}
尝试将其投射到报告并保存
...
ReportParser rp = new ReportParser();
rp.setName(unparsed_string);
rp.setValue(unparsed_string);
Report r = (Report)rp;
this.dao.saveReport(r);
在我转移到ORM之前,我已经使用了这种模式,但我无法弄清楚如何使用Hibernate来实现这一点。 可能吗?
是否有必要对实体进行子类化? 您可以使用构建器模式:
public class ReportBuilder {
private Report report;
public ReportBuilder() {
this.report = new Report();
}
public ReportBuilder setName(String unparsedString) {
// do the parsing
report.setName(parsedString);
return this;
}
public ReportBuilder setValue(String unparsedString) {
// do the parsing
report.setValue(parsedString);
return this;
}
public Report build() {
return report;
}
}
Report report = new ReportBuilder()
.setName(unparsedString)
.setValue(unparsedString)
.build();
dao.saveReport(report);
你不应该扩展实体类,除非做出更专门化的实体类。 与实体相关的注释保留在子类中,因此Hibernate会感到困惑。
将业务逻辑放在实体类中也具有很大的争议性 - 您必须了解像Hibernate这样的JPA实现者可能(通常会)通过生成的代理来运行您的getter / setter。 如果内部存在复杂的逻辑,您可能会遇到难以追踪的问题。
链接地址: http://www.djcxy.com/p/9153.html上一篇: How to persist an entity from an non
下一篇: C# and Moq, raise event declared in interface from abstract class mock