gpt4 book ai didi

hibernate - 使用接口(interface)覆盖 @Embedded 的 @ManyToOne targetEntity

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

我正在为 ORM 使用 hibernate 和注释。
我有所有 bean 的接口(interface),并且我使用 targetEntity 来建立关系:
hibernate 无法派生类型,因为 getter 返回的是接口(interface)而不是 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;
}

}

我得到 MappingException:无法确定类型:字段,表:图表,列:[org.hibernate.mapping.Column(field)]

使用 bean 而不是接口(interface)进行属性和 getter/setter 声明可以解决问题,但我想坚持使用接口(interface)。单独使用 bean 进行属性声明并不能解决问题。

谁能指出我正确的方向?

最佳答案

我已经使用了一段时间的可行解决方案,但它包括供应商锁定的小案例。我发现仅使用 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; }

}

但是在消费类中,我们使用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
}

结果:
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)

关于hibernate - 使用接口(interface)覆盖 @Embedded 的 @ManyToOne targetEntity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258072/

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