我正在为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进行属性声明并不能解决问题.
有人能指出我正确的方向吗?
我已经使用了一个可行的解决方案一段时间了,但它包括供应商锁定的小情况。我发现无法仅使用 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)
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |