Hibernate @指向同一实体的不同类中的一个域

Hibernate @指向同一实体的不同类中的一个域,hibernate,jpa,one-to-many,Hibernate,Jpa,One To Many,我有两个实体(称为EntityA和EntityB),它们的ID是随机生成的UUID(因此可以认为该ID是全局唯一的)。 现在我想允许用户为A和B存储额外的元数据(称为“标记”),但在同一个表“TagValue”中 如果使用Hibernate的模式生成,则EntityB会出现以下错误: 10:47:00,912 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 58) HHH000388: U

我有两个实体(称为EntityA和EntityB),它们的ID是随机生成的UUID(因此可以认为该ID是全局唯一的)。 现在我想允许用户为A和B存储额外的元数据(称为“标记”),但在同一个表“TagValue”中

如果使用Hibernate的模式生成,则EntityB会出现以下错误:

10:47:00,912 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 58) HHH000388: Unsuccessful: alter table TagValue add constraint FK_ijg5p0jl85r50shhygdudcxh4 foreign key (object_id) references EntityA.
JPA应该支持这种映射方法吗?如果是这种情况,有没有办法避免在TagValue/object_id上生成约束


提前谢谢

如果需要单向关系,则无需指定引用的列名。这正试图创建一个双向关系,但由于您的
TagValue
对象中没有
EntityA
对象,Hibernate对您说“我希望有一个
EntityA
对象附加此ID,但它不在这里”

如果这对你不起作用,让我知道,我会修改我的答案

@Entity
@Table
public class EntityA {
    @Id
    private String uuid;

    // Optional tags
    @OneToMany
    @JoinColumn(name="object_id")
    private List<TagValue> tags = new LinkedList<TagValue>();
// other fields
}

试试这些方法中的任何一种。他们也应该为
EntityB
工作。如果第一个数据库无法正常工作,请尝试使用联接表。

是否尝试删除数据库?Hibernate中的模式自动生成功能非常有限,对于实际系统,您总是需要手工编写ddl脚本。删除模式没有帮助。但是,如果TagValue中的数据通过objectId引用EntityA和EntityB,那么这两个表的约束创建将失败。谢谢您的回答。我尝试了第一种方法,Hibernate仍然尝试为EntityA和EntityB创建外键约束。关于第二种方法,我希望避免为每个有标记的实体都有一个联接表。但是,您不想要外键吗?如果没有两个外键(一个用于EntityA,一个用于EntityB),则无法建立关系。事实上,我不希望TagValue表中的外键用于objectId字段。Hibernate尝试执行以下操作:-“fk_ijg5p0JL85R50shhygdcxh4”外键(对象id)引用EntityA(uuid)-“fk_ijg5p0JL85R50shhygdcxh4”外键(对象id)引用EntityB(uuid),因此您希望外键存储在
EntityA
EntityB
对象上吗?是这样吗?听起来你真的想要一个联接表。这样您的
TagValue
就不会存储外键,两个外键都存储在联接表中。另外,Hibernate将透明地管理联接表。你不需要做任何事情来让它工作。
10:47:00,912 ERROR [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 58) HHH000388: Unsuccessful: alter table TagValue add constraint FK_ijg5p0jl85r50shhygdudcxh4 foreign key (object_id) references EntityA.
@Entity
@Table
public class EntityA {
    @Id
    private String uuid;

    // Optional tags
    @OneToMany
    @JoinColumn(name="object_id")
    private List<TagValue> tags = new LinkedList<TagValue>();
// other fields
}
@Entity
@Table
public class EntityA {
    @Id
    private String uuid;

    // Optional tags
    @OneToMany
    @Join(name="ENTITY_A_TAGS",
        joinColumns = @JoinColumn(name="uuid"),
        inverseJoinColumns = @JoinColumn( name="object_id"))
    private List<TagValue> tags = new LinkedList<TagValue>();
// other fields
}