@Embeddable和@EmbeddedId仅包含复杂的类

时间:2013-04-04 20:49:48

标签: java-ee jpa

我有以下问题:

我的一个实体必须使用复杂的类作为ID。 (为了解决这个问题,我使用了@EmbeddedId)

复杂类具有2个其他复杂类的组合主键[我收到以下错误:引起:org.hibernate.AnnotationException:model.IElementKey没有持久性id属性:model.impl.Element.id]。

问题是如何在不向ID类添加非复杂类型的情况下解决此问题。

编辑:我必须只使用JPA [javax.persistence。*]

Edit2:小代码示例(为简单起见,省略了getter / setter)

@Embeddable
public class EntityKey implements IEntityKey, Serializable {

    private static final long   serialVersionUID    = 1L;

    @ManyToOne(targetEntity = Entity1.class, optional = false)
    private IEntity1                entity1             = null;

    @ManyToOne(targetEntity = Entity2.class, optional = false)
    private IEntity2                entity2             = null;

}

@Entity
public class MixEntity implements IMixEntity {

    @EmbeddedId
    private IEntityKey  id              = null;

}


@Entity
public class Entity1 implements IEntity1 {

    @Id
    private Long id = null;

    @OneToMany(targetEntity = MixEntity.class, mappedBy = "id.entity1")
    private List<IMixEntity>    mixEntities = new ArrayList<IMixEntity>();

}

@Entity
public class Entity2 implements IEntity2 {

    @Id
    private Long id = null;

    @OneToMany(targetEntity = MixEntity.class, mappedBy = "id.entity2")
    private List<IMixEntity>    mixEntities = new ArrayList<IMixEntity>();

}

2 个答案:

答案 0 :(得分:0)

我在这种情况下的建议是使用具体类而不是抽象类或接口。原因是JPA,Hibernate等在幕后使用反射,并且在这种情况下需要具体类例如这个并且检索自动生成查询的信息。如果在framekork调用clazz.instance()时使用抽象类,则会出现异常。

因此你应该使用具体的类。

我希望这可以帮助

答案 1 :(得分:0)

可能有点晚了。 但也许它仍然可以帮助其他人:

我知道写起来似乎很简单 @EmbeddedId(targetEntity = SomeClass.class)

但是因为它对你的错误没有影响,试试吧 @Target注释。

它将完成这项工作。

@Entity
public class MixEntity implements IMixEntity {

    @EmbeddedId
    @Target(EntityKey.class)
    private IEntityKey  id              = null;

}