【问题标题】:PostgreSQL network types in HibernateHibernate 中的 PostgreSQL 网络类型
【发布时间】:2014-02-05 20:59:27
【问题描述】:

我想在 Hibernate ORM 中使用 Postgresql 网络数据类型的 mac 地址 (macaddr)。如何将 macaddr 类型映射到实体类属性?这样做的最佳方法是什么?我从未在 Hibernate 中使用过非标准 SQL 类型

谢谢

【问题讨论】:

    标签: java hibernate postgresql


    【解决方案1】:

    Mac 地址是一个字符串。如果它是 mac 地址与其用户之间的@OneToOne 关系,那么您不必用简单的字符串创建实体类,只需将其作为字段包含在任何需要它的实体上,如下所示:

    private String macAddress;
    

    如果多个实体使用相同的 mac 地址,并且您想重用该值(规范化),那么您将创建一个这样的实体:

    package com.acme.model;
    
    import java.io.Serializable;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class MacAddress implements Serializable {
    
        private static final long serialVersionUID = 1l;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        private String value;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    }
    

    【讨论】:

    • Mac 地址不是“字符串”。在 Postgres 中,它是一个自己的数据类型,有自己独特的运算符。用于定义表中的列,而不是创建实体(表)
    【解决方案2】:

    我只是解决了这样的问题,所以我成功地从 DB postgresql 9 插入和获取行。完整解释的解决方案在此链接network postgres types on hibernate

    【讨论】:

      【解决方案3】:

      因为 mac-address 永远不会被完全验证,Java 中没有 Standard-Type。你可以使用

      @ColumnTransformer(read="CAST(mac AS varchar)", write="CAST(? AS macaddr)") String 
      

      而不是将其作为字符串读取/写入。

      【讨论】:

      • 您不能将 mac 转换为 varchar,因为它们不兼容二进制文件类型。我想您需要先创建一个函数,然后使用该函数进行强制转换。
      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 2011-01-12
      • 2012-09-20
      • 2019-04-17
      • 2012-12-23
      • 2014-04-06
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多