gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:10:57 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com