• JPA的Embeddable注解


    来源于http://zjsword2000.blog.163.com/blog/static/4583983320083184844734/

    在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类大概是什么样呢?如下:

           import java.io.Serializable;

    import javax.persistence.Embeddable;

    @Embeddable

    public class Name implements Serializable {

     private String firstName;

     private String lastName;

     public Name() {

     }

     public Name(String firstName, String lastName) {

      this.firstName = firstName;

      this.lastName = lastName;

     }

     public String getFirstName() {

      return firstName;

     }

     public void setFirstName(String firstName) {

      this.firstName = firstName;

     }

     public String getLastName() {

      return lastName;

     }

     public void setLastName(String lastName) {

      this.lastName = lastName;

     }

     @Override

     public String toString() {

      return firstName+" "+lastName;

     }

     

    }

    值的注意的是:

    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的每一个属性.

  • 相关阅读:
    循环神经网络(RNN)的改进——长短期记忆LSTM
    AlphaGO的背后/《mastering the game of GO wtth deep neural networks and tree search》研究解读
    <科普>CPU进行四则运算(加减乘除)的主流方法
    在CV尤其是CNN领域的一些想法
    只要听说过电脑的人都能看懂的网上pdf全书获取项目
    python简单爬虫(爬取pornhub特定关键词的items图片集)
    并查集模板
    Linux命令学习-cp命令
    Linux命令学习-mv命令
    Linux命令学习-ls命令
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3141112.html
Copyright © 2020-2023  润新知