jjzjj

java - Hibernate + PostgreSQL + 网络地址类型(inet、cdir)

coder 2024-03-19 原文

我已经使用 Hibernate 4.2.7 和 PostgreSQL 9.3.1 开始我的示例项目,一切进展顺利。

目前我想使用 INET PostgreSQL type但我无法用 Hibernate 映射它。

我收到此 hibernate 错误:无法确定类型:inet,表:DEVICE_IP_ADDRESS,列...

我使用 org.hibernate.dialect.PostgreSQLDialect 和 hbm.xml 配置文件。

我的 hibernate 映射文件:

<property name="ipAddress" type="inet">
     <column name="IP_ADDRESS" not-null="true" />
</property>

我问过谷歌,但找不到任何可用的解决方案。 你能帮帮我吗?

谢谢!

编辑: 如果我想使用“额外的”postgresql 类型和 PostGIS,您认为我需要使用什么样的 ORM 实现?类型?

或者我需要使用简单的 JDBC?

最佳答案

我只是解决了你这样的问题。关于这件事的信息很少。正如 @ms03 所说...更好的方法是创建一个新类型和一个实现此类型的类,并处理用于设置/获取数据库的 java 对象。

首先在您的实体上,您必须为您的参数声明类型。

@Entity
@Table(name="user_app")
@TypeDefs(value={@TypeDef(name="convertInet",typeClass=PgInetType.class),
         @TypeDef(name="convertMacaddr",typeClass=PgMacaddrType.class)})
public class User implements Serializable {

    //some parameters

  @Type(type="convertMacaddr")
  private PgMacaddr mac;

  @Type(type="convertInet")
  private PgInet ip;

     //getters and setters, equals, hashcode, toString
  }

其次创建为 java 处理的新对象,它必须有一个默认构造,一个用于处理来自 DB 的数据并可序列化的构造。

public class PgInet implements Serializable {

private static final long serialVersionUID = 1L;

private String address;

public PgInet(String address){
    this.address=address;
}

public PgInet(){
    this.address=null;
}

    //Getters,setters,hashcode, equal and toString
 }

最后一步你必须创建一个自定义类型

public class PgInetType implements UserType{

@Override
public int[] sqlTypes() {

            //Because inet,macaddr,cdir...and unkwon type for java, yo must
            // define Types.OTHER
    return new int[] { Types.OTHER };
}

@Override
public Class returnedClass() {

            //Object created to be handled for java
    return PgInet.class;
}

@Override
public boolean equals(Object x, Object y) throws HibernateException {
    return ObjectUtils.nullSafeEquals(x, y);
}

@Override
public int hashCode(Object x) throws HibernateException {
    if(x!=null)
        return x.hashCode();
    else
        return 0;
}

@Override
public Object nullSafeGet(ResultSet rs, String[] names,
        SessionImplementor session, Object owner)
        throws HibernateException, SQLException {

            //Translation from DB to Java
    PgInet address=null;

    String ip=rs.getString(names[0]);

    if(ip!=null){
        address=new PgInet(ip);
    }

    return address;
}

@Override
public void nullSafeSet(PreparedStatement st, Object value, int index,
        SessionImplementor session) throws HibernateException, SQLException {

    //Translation from java to DB

    if(value==null){
        st.setNull(index, Types.VARCHAR);
    }else{

                //As inet,macaddr,cdir...are new types object on Postgresql you must
                //create the specific postgresql object and to insert it

                //I created 2 new cast on postgresql: inet As varchar, varchar AS inet
                //but I think it's not neccesary because macaddr type works fine without
                //postgresl casting

        st.setObject(index, getInet(value, st.getConnection()));
    }

}

private Object getInet(Object value, Connection connection) {

           //Expected object on postgresql

       Object tempInet = null;
       ClassLoader connectionClassLoader = connection.getClass().getClassLoader();

       try {

           //Class which will create the postgresql

           Class aPGObjectClass =connectionClassLoader.loadClass("org.postgresql.util.PGobject");
           Constructor ct = aPGObjectClass.getConstructor(null);
           try {
            tempInet = ct.newInstance(null);
        } catch (InstantiationException | IllegalAccessException
                | IllegalArgumentException | InvocationTargetException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }

           Method setTypeMethod = aPGObjectClass.getMethod("setType", new Class[]{String.class});
           try {

               //Setting postgresql type, inet in this case

            setTypeMethod.invoke(tempInet, new Object[]{"inet"});
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

           Method setValueMethod = aPGObjectClass.getMethod("setValue", new Class[]{String.class});
           try {
            setValueMethod.invoke(tempInet, new Object[]{value.toString()});
        } catch (IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

       } catch (ClassNotFoundException e) {

       } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

       return tempInet;
   }

@Override
public Object deepCopy(Object value) throws HibernateException {
    if(value==null)
        return null;
    else{
        PgInet PgInetNew=new PgInet();
        PgInet PgInetOriginal=(PgInet)value;

        PgInetNew.setAddress(PgInetOriginal.getAddress());

        return PgInetNew;
    }
}

@Override
public boolean isMutable() {
    return false;
}

@Override
public Serializable disassemble(Object value) throws HibernateException {
     Object  deepCopy=deepCopy(value);

      if(!(deepCopy instanceof Serializable))
       return (Serializable)deepCopy;

      return null;
}

@Override
public Object assemble(Serializable cached, Object owner)
        throws HibernateException {
    return deepCopy(cached);
}

@Override
public Object replace(Object original, Object target, Object owner)
        throws HibernateException {
    return deepCopy(original);
}

 }

当我从数据库中插入或获取一行时,这种方式对我来说效果很好。

关于java - Hibernate + PostgreSQL + 网络地址类型(inet、cdir),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019866/

有关java - Hibernate + PostgreSQL + 网络地址类型(inet、cdir)的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  10. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

随机推荐