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

时间:2014-05-04 09:41:15

标签: hibernate jpa one-to-many

我有两个实体(称为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上生成约束?

提前致谢!

1 个答案:

答案 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。如果您无法使第一个工作,请尝试使用连接表。