@OneToMany在不同的类中指向同一个实体



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

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

EntityB与uuid和tags部分类似。

现在TagValue:

@Entity
@Table
public class TagValue {
   @Id
   private String id;
   // Referenced object UUID
   @Column(name="object_id")
   private String objectId;
   // Tag type
   @ManyToOne
   @JoinColumn(nullable=false)
   private TagType type;
   // Value
   @Column(nullable=false)
   private String value;
}

如果我使用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上生成约束?

提前感谢!

如果需要单向关系,则不需要指定引用的列名。这是试图创建一个双向关系,但因为你没有EntityA对象在你的TagValue对象,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
}

如果您愿意,您也可以使用JoinTable来分离关系。

@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
}

试试这两种方法中的任何一种。它们也应该适用于EntityB。如果不能使第一个表工作,请尝试使用连接表。

最新更新