使用接口覆盖@Embedded的@ManyToOne targetEntity

use*_*634 8 hibernate jpa

我正在为ORM使用hibernate和annotations.我有所有bean的接口,我使用targetEntity作为关系:hibernate无法派生类型,因为getter返回一个接口而不是bean.

我得到嵌入式bean的MappingException(无法确定类型).

@Entity(name="FieldBean")
public class FieldBean implements Field {
    ...
}

@Embeddable
public class FacetBean implements Facet {
    ...    

    @ManyToOne(targetEntity = FieldBean.class)
    @JoinColumn(name = "field_id")
    public Field getField() {
        return field;
    }

}

@Entity(name = "Chart")
public class ChartBean implements Chart {

    @Embedded
    @AssociationOverride(
        name = "field",
        joinColumns = @JoinColumn(name = "category_facet_field_id")
    )
    public Facet getCategoryFacet() {
        return categoryFacet;
    }

}
Run Code Online (Sandbox Code Playgroud)

我得到MappingException:无法确定类型:Field,at table:chart,for columns:[org.hibernate.mapping.Column(field)]

使用bean而不是接口来获取属性和getter/setter声明解决了这个问题,但我想坚持使用接口.单独使用bean进行属性声明并不能解决问题.

有人能指出我正确的方向吗?

bla*_*gae 5

我已经使用了一个可行的解决方案一段时间了,但它包括供应商锁定的小情况。我发现无法仅使用 JPA 注释来实现此目的,但有一个特定于 Hibernate 的注释@Target可以实现此目的。我也做了和你一样的事情,达到了预期的效果。但是,我没有使用您的其他注释,因此我不能保证它会按您的预期工作。

Embeddable 类中没有发生任何奇怪的事情:

public interface PointsInt extends Serializable {
    int offensivePoints();

    int defensivePoints();

}

@Embeddable
public class Points implements PointsInt {
    private int def;
    private int off;
    public int offensivePoints() { return off; }

    public int defensivePoints() { return def; }

}
Run Code Online (Sandbox Code Playgroud)

但在消费类中,我们使用 Hibernate 的@Target

import javax.persistence.*;
import org.hibernate.annotations.Target;

@Entity
public class Series extends LongIdEntity implements Serializable {

    @Embedded
    @Target(Points.class)
    private PointsInt points;
    // I prefer to declare my annotations on fields rather than methods
}
Run Code Online (Sandbox Code Playgroud)

结果:

mysql> describe series;
+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| id              | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| def             | int(11)     | YES  |     | NULL    |                |
| off             | int(11)     | YES  |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+
3 rows in set (0.12 sec)
Run Code Online (Sandbox Code Playgroud)