一尘不染

映射第三方库中的值对象

hibernate

我有以下实体,我需要通过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

无法修改时,如何让Hibernate进行基于注释的映射Buzz


阅读 262

收藏
2020-06-20

共1个答案

一尘不染

您要搜索的称为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();
    }

}

唯一的缺点:您不能使用Buzzin的实例Fizz

2020-06-20