Java 使用Hibernate DAO保存接口
对于我的类示例,我有一个接口IExample,它是一个Hibernate实体,因为我希望我的应用程序允许其他开发人员更改我的模型层的实现。我的界面如下:Java 使用Hibernate DAO保存接口,java,hibernate,interface,dao,Java,Hibernate,Interface,Dao,对于我的类示例,我有一个接口IExample,它是一个Hibernate实体,因为我希望我的应用程序允许其他开发人员更改我的模型层的实现。我的界面如下: public interface IExample { public int getId (); public void setId (int id); public IOtherClass getOtherClass (); public void setOtherClass (IOtherClass ot
public interface IExample {
public int getId ();
public void setId (int id);
public IOtherClass getOtherClass ();
public void setOtherClass (IOtherClass otherClass);
}
IOtherClass是另一个Hibernate实体OtherClass的接口
我的班级是:
@Entity
@Table(name="example")
public class Example implements IExample {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@OneToOne(targetEntity=OtherClass.class)
@JoinColumn(name="otherclass")
private IOtherClass otherClass;
}
如您所见,我正在使用接口IOtherClass并将其映射到一个Hibernate实体
targetEntity=OtherClass.class
这很好,但是当我尝试使用DAOs时,问题就出现了。在我的示例中,我使用IOtherClass时,我希望能够告诉我的hibernate,当我调用时:
Example example = new Example();
IOtherClass otherClass = example.getOtherClass(); // Returns IOtherClass
getCurrentSession().save(otherClass);
我并没有试图保存接口,而是保存我的OtherClass实体。如果我尝试这样做,实际上,我会得到一个例外:
Unable to locate persister: IOtherClass
一种选择是显式地将我的DAO获得的每个IOtherClass实体强制转换为OtherClass,但这是不安全的,看起来并不是编写此代码的最佳方式
我的问题是:当我的DAO收到IOtherClass实例时,是否有一种方法(通过注释或类似的方式)告诉他们要查找什么类?只是尝试了一下,但没有成功。显然,您不能将其用于接口。您确定example.getOtherClass()不是null并且是OtherClass的实例吗?Session.save不关心其参数的编译时类型。是的,我已经检查过了。我对这个问题的最终解决方案实际上是在我的抽象父类中创建一个抽象方法,将接口强制转换到实际的类,现在它可以工作了,所以我不可能不返回正确的对象。谢谢你的回答我无法重现Hibernate 5.4的问题,所以我猜是这样。如果我把具体的类放在Hibernate的配置文件中,一切都很好,只是尝试了一下,没有成功。显然,您不能将其用于接口。您确定example.getOtherClass()不是null并且是OtherClass的实例吗?Session.save不关心其参数的编译时类型。是的,我已经检查过了。我对这个问题的最终解决方案实际上是在我的抽象父类中创建一个抽象方法,将接口强制转换到实际的类,现在它可以工作了,所以我不可能不返回正确的对象。谢谢你的回答我无法重现Hibernate 5.4的问题,所以我猜是这样。如果我把具体的类放在Hibernate的配置文件中,一切都正常。