我有两个实体(称为EntityA和EntityB),其ID是随机生成的UUID(因此ID可以视为全局唯一)。 现在我想让用户为A和B存储额外的元数据(称为"标记"),但是在同一个表格中,#Tag; 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上生成约束?
提前致谢!
答案 0 :(得分:0)
如果您想要单向关系,则无需指定引用的列名称。那是试图创建一个双向关系,但因为你的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
。如果您无法使第一个工作,请尝试使用连接表。