我有两个实体(称为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
。如果不能使第一个表工作,请尝试使用连接表。