zoukankan      html  css  js  c++  java
  • Hibernate @Embeddable注释

      在hibernate中实现自定义类型,只要实现UserType接口即可或者以Component的形式提供.JPA的@Embedded注释可以在你的Entity中使用一般的Java对象,此对象需要用@Embeddable标注

      例如Person类有一个name属性,name应该有firstName,lastName两个属性,一般的写法直接在entity中写两个属性:

    private String firstName;
    private String lastName;

      我们可以用一个Name类来代替这样的写法,此类包含了firstName和lastName,如此一来,我们在entity只要这样写: private Name name; 就可以了。

    Name类的定义如下:

    @Embeddable
    public class Name implements Serializable {
        private String firstName;
        private String lastName;
        //省略get、set方法
    }

    注意:

    1.必须要实现serializable接口

    2.需要有无参的构造函数

    3.@Embeddable注释,表示此类可以被插入某个entity中

    下面将Person类中的name属性与数据库表中的first,last两个字段进行映射,如下:

        @Embedded
        @AttributeOverrides({@AttributeOverride(name="firstName", column = @Column(name = "first_name")), @AttributeOverride(name = "lastName", column = @Column(name = "last_name")) })
        public Name getName() {
            return name;
        }

    通过@AttributeOverride注释来指定Name类的firstName,lastName与数据库中表的first_name,last_name进行映射.

    很简单吧,看起来蛮爽的.可发现一个不大不小的缺点,比如,我要查询一个姓名dennis zane的人,如果是hibernate,我也许这样做:

    session.createQuery("from Person p where p.name=?").setParameter(0,name).list();

    Hibernate将自动将你的自定义类型进行匹配,可如果我在JPA中这样写:

    em.createQuery("select p from Person p where p.name=:name").setParameter("name",name);

    查询出错...郁闷,把整个name对象作为查询参数传进去就出错,我非要这样写:

    em.createQuery("select p from Person p where p.name.firstName=:name1 and p.name.lastName=:name2").setParameter("name1",name.getFirstName()).setParameter("name2",name.getLastName);

    也就是需要你自己去映射Name的每一个属性.

  • 相关阅读:
    【转载】C/C++中extern关键字详解
    【转载】extern "C"的用法解析(原博主就是抄百度百科的,不如另外一篇好)
    lua Date和Time
    MySQL-Linux安装
    Hive-0.13安装
    MR案例:单表关联查询
    MR案例:小文件处理方案
    MR案例:链式ChainMapper
    MR案例:定制Partitioner
    MR案例:多文件输出MultipleOutputs
  • 原文地址:https://www.cnblogs.com/SaraMoring/p/5640584.html
Copyright © 2011-2022 走看看