Log*_*ith 6 java hibernate jpa jpa-2.0
我有以下情况:
我正在尝试使用相同的表在一个数据库中构建一个具有相同租户的多租户应用程序.据我所知,Hibernate在5.0之前不支持这个变种.
我试图通过在每个表中添加brandId字段来解决这个问题.
当我构建Many To Many关系时,我还将这个brandId添加到ManyToMany Join Table和这里(不知道我是否可以这样做,mysql没有抱怨)我为两个表创建了一个外键,同时包括brandid
所以现在例如我有一个表Text(ID,name,brandId)和一个Tag(ID,name,brandId)和一个连接表(text_id,tag_id,brand_id),其中外键是
CONSTRAINT FK_TAG_TEXTS_TAG FOREIGN KEY (TAG_ID,BRAND_ID) REFERENCES TAG (ID,brand),
CONSTRAINT FK_TAG_TEXTS_TEXT FOREIGN KEY (TEXT_ID,BRAND_ID) REFERENCES TEXT (ID,brand)
如您所见,品牌ID被使用了两次.
然后我用Hibernate Tools生成了我的类,它创建了一个复合主键类,它和Tag类中的关联.
  @ManyToMany(fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE })
  @JoinTable(name = "tag_texts", , joinColumns = {
    @JoinColumn(name = "TAG_ID", nullable = false, insertable = false, updatable = false),
    @JoinColumn(name = "BRAND_ID", nullable = false, insertable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "TEXT_ID", insertable = false, nullable = false, updatable = false),@JoinColumn( name = "BRAND_ID",  insertable = false, nullable = false, updatable = false) })
public List<Text> getTexts() {
    return this.texts;
}
问题是现在我得到以下异常:
org.hibernate.MappingException:集合映射中的重复列:de.company.domain.Tag.texts column:brand_id
我查看了Collection类中的Hibernate代码,它引发了异常.这里调用了一个方法'checkColumnDupliation',它使用一个Set并插入名称,这意味着第二次插入"BRAND_ID"作为列会导致这种行为.
我发现重复列错误的最常见解决方案是在几个引用中使用相同的列时插入'insertable = false和updateable = false'.这里描述:
Hibernate:insertable = false,updatable = false属于涉及外键的复合主键星座?
但这似乎与我的问题不同.
所以我的问题是:是否有可能使用JPA Annotations解决这个问题,并在joinColumns和inverseJoinColumns中使用Brand ID?
问题是您需要 3 个实体之间的 JoinTable:Text、Tag和Brand。
可能您将不得不使用IdClass,例如:
public class AssociationId implements Serializable {
  private long textId;
  private long tagId;
  private long brandId;
  hash and equals function
  ...
}
ID 类实体:
@Entity
@Table(name="tag_text_brand")
@IdClass(AssociationId.class)
public class TagTextBrandAssociation {
  @Id
  private long tagId;
  @Id
  private long textId;
  @Id
  private long textId;
  @ManyToOne
  @PrimaryKeyJoinColumn(name="TAG_ID", referencedColumnName="ID")
  private Tag tag;
  @ManyToOne
  @PrimaryKeyJoinColumn(name="TEXT_ID", referencedColumnName="ID")
  private Text text;
  @ManyToOne
  @PrimaryKeyJoinColumn(name="BRAND_ID", referencedColumnName="ID")
  private Brand brand;
  ...
}
您可以在 3 个实体中使用它,如下所示:
@Entity
public class Text {
  @Id
  private long id;
  ...
  @OneToMany(mappedBy="text")
  private List<TagTextBrandAssociation> tagsAndBrands;
  ...
}
浏览此处获取更多信息。
| 归档时间: | 
 | 
| 查看次数: | 1271 次 | 
| 最近记录: |