首页 文章

如何在Scala中实现org.hibernate.Session

提问于
浏览
5

“会话”接口有两种方法,在Scala中由于类型擦除而减少为具有相同的签名:

public ProcedureCall createStoredProcedureCall(String procedureName, Class... resultClasses)

public ProcedureCall createStoredProcedureCall(String procedureName, String... resultSetMappings)

尝试实现它们会产生错误:

错误:double定义:方法createStoredProcedureCall:(procedureName:String,resultSetMappings:String *)org.hibernate.procedure.ProcedureCall和方法createStoredProcedureCall :( procedureName:String,resultClasses:Class [_])org.hibernate.procedure.ProcedureCall at line 199擦除后具有相同的类型:(procedureName:String,resultSetMappings:Seq)org.hibernate.procedure.ProcedureCall override def createStoredProcedureCall(procedureName:String,resultSetMappings:String):ProcedureCall = null ^

那么我将如何以编译和工作的方式实现此接口?

1 回答

  • 1

    正如serejja指出的那样,您可以在Java中编写一个垫片来为您进行翻译:

    Java的:

    package jibernate;
    
    import org.hibernate.procedure.ProcedureCall;
    import org.hibernate.SharedSessionContract;
    
    public abstract class Yava implements SharedSessionContract {
    
      public ProcedureCall createStoredProcedureCallC(String n, Class... xs) {
        return createStoredProcedureCall(n, xs);
      }
    
      public ProcedureCall createStoredProcedureCallS(String n, String... xs) {
        return createStoredProcedureCall(n, xs);
      }
    
    }
    

    如果你正在使用sbt,它可以存在于src / main / java / jibernate / Yava.java中

    斯卡拉:

    package whybernate
    
    trait Mehssion extends jibernate.Yava {
    
      import org.hibernate.procedure.ProcedureCall
    
      def createStoredProcedureCall(n: String, h: Class[_], t: Class[_]*) =
        createStoredProcedureCallC(n, (h +: t):_*)
    
      def createStoredProcedureCall(n: String, h: String, t: String*) =
        createStoredProcedureCallS(n, (h +: t):_*)
    
    }
    

    您可以以相同的方式调用这些函数,利用您保证至少有一个所需的varargs这一事实 .

相关问题