hibernate - 从第三方库映射值对象

标签 hibernate jpa

我有以下实体,我需要通过 Hibernate 保留到关系数据库中注释 :

@Entity
@Table(name="fizzes")
public class Fizz {
    @Id @GeneratedValue
    @Column(name="fizz_id")
    private int id;

    @Column(name="fizz_wooz")
    private String wooz;

    // ??? here I am unsure!
    private Buzz buzz;

    // Constructor, getters/setters down here, etc...
}

public class Buzz {
    private int jupiter;

    private String neptune;

    // Constructor, getters/setters down here, etc...
}
Buzz 的问题是:
  • 我愿意 不是 希望它是它自己的实体/表。我希望它是映射到 fizzes 的“值对象/类型”表(通过向其中添加列的方式)
  • Buzz来自第三方库,因此我无法修改它

  • 因此,我正在寻找的表格形式的最终结果是:
    [fizzes] table
    ==============
    fizz_id, PRIMARY KEY AUTO INCREMENT
    fizz_wooz, NVARCHAR(50) NOT NULL
    fizz_buzz_jupiter, INT NOT NULL
    fizz_buzz_neptune, NVARCHAR(100) NOT NULL
    

    当我无法修改 Buzz 时,如何让 Hibernate 执行此基于注释的映射?

    最佳答案

    您正在搜索的名称是 Embeddable .

    @Entity
    public class Fizz {
        ...
    
        @Embedded
        private Buzz buzz;
    
    }
    

    您可以为Buzz定义一个映射文件。 :
    <entity-mappings version="1.0" xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
                            http://java.sun.com/xml/ns/persistence/orm_1_0.xsd">
        <embeddable class="...Buzz">
            <attributes>
                <basic name="jupiter"><column name="fizz_buzz_jupiter"/></basic>
                <basic name="neptune"><column name="fizz_buzz_neptune"/></basic>
            </attributes>
        </embeddable>
    </entity-mappings>
    

    您可以将该映射文件包含在您的 persistence.xml 中。 :
    <persistence-unit>
        <mapping-file>.../orm.xml</mapping-file>
    </persistence-unit>
    

    如果你真的想对 Buzz 使用注解:您不能为其他类定义注释。这就是注释的含义:它们是内联的并且属于它们的类。否则与映射文件相比没有任何好处......

    但是你可以扩展 Buzz并使用该属性访问权限:
    @Entity
    public class Fizz {
        ...
    
        @Embedded
        private BuzzExtension buzz;
    
    }
    
    @Embeddable
    @Access(AccessType.PROPERTY)
    public class BuzzExtension extends Buzz {
        @Column(name="fizz_buzz_jupiter")
        public int getJupiter() {
            return super.getJupiter();
        }
    
        @Column(name="fizz_buzz_neptune")
        public String getNeptune() {
            return super.getNeptune();
        }
    
    }
    

    唯一的缺点:你不能使用 Buzz 的实例在 Fizz .

    关于hibernate - 从第三方库映射值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164244/

    相关文章:

    java - 使用 “gradle-3.5”构建Web应用程序,但在JPA中始终失败

    java - jpa hibernate 一对一更新

    java - 在Hibernate中创建自动递增的数据库字段

    java - 在hibernate注释中映射超过2个表

    java - 是否可以序列化hibernate EntityManagerFactory?

    java - Spring-Data:具有 Java 配置的未知实体

    java - Hibernate prepareConnection/preparedStatement 问题

    java - 在事务中间更新数据库,可能吗?

    java - hibernate 时从 parent 到 child 的ID

    java - Spring @Transactional(Propagation.NEVER) 应该创建 Hibernate session 吗?