将表中的列取消唯一性限制 - Hibernate

6
Hibernate取消表中列的唯一性约束(已解决)
我想要一个字段本身不唯一,但与其他字段的组合在表中是唯一的。我已经有了一个包含两个列(复合主键)的表:id(主键)和object_proxy_id(主键),这正是我需要的,但Hibernate会将object_proxy_id设置为唯一的,因此该值不能在表中重复出现,而我需要该列接受重复值。因为每个用户都有自己的对象代理,而这些代理不一定是唯一的。 这是我想要实现的:
|-------------------------------|
| tbl_object_proxy              |
| ------------------------------|
| Id (pk)| object_proxy_id (pk) |
|-------------------------------|
| 1      | 150 --               |
| 1      | 149  |= must be able to be DUPLICATE which is not the case right now.
| 2      | 150 --               |
| 2      | 151                  |
|-------------------------------|

当前代码:

@Entity
@Table(name = "tbl_user_settings", uniqueConstraints = {@UniqueConstraint(columnNames={"user_id"})})
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

public class Settings implements Serializable
{
@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_SOMENAME", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="someSequence")
@Column(name="id")
private int setting_id;

@OneToOne
private User user;

@ManyToOne
private SomeObject someobject;

@ElementCollection
@CollectionTable(name="tbl_collection_name", joinColumns=
@JoinColumn(name="id"), uniqueConstraints = {@UniqueConstraint(columnNames={"id", "object_proxy_id"})})
@Column(name="SomeObject")
private Set<SomeObject> objectProxy;

/*...constructors and methods...*/
}

结果为:

-- Table schema
|-------------------|                    
| tbl_user_settings |                        
|-------------------|                        
| id                |PK <<Unique>>                      
| user_id           |FK reference tbl_user <<Unique>>                        
| object_id         |FK reference tbl_object  
|-------------------|

|------------------|
| tbl_object_proxy |
|------------------|
| id               |PK reference tbl_user_settings 
| object_proxy_id  |PK reference tbl_object <<Unique>> BUT I DON'T WANT THIS TO BE UNIQUE ON ITSELF !!!!
|------------------|

编辑: tbl_object_proxy中的两个主键是复合主键
我尝试过Xeon的解决方案但它没有起作用。


1
你是在谈论复合主键吗? - adarshr
是的,我在谈论复合主键。我已经编辑了我的问题。 - Ben
2个回答

2

简短回答:@ElementCollection替换为一个像这样的@ManyToMany关系,其中包含一个@JoinTable

@ManyToMany
@JoinTable(
name="tbl_settings_objecteproxy_v2",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id"))
private Set<SomeObject> objectproxy;

请参阅Hibernate注释文档中的“2.2.5.3.2.1.定义”部分。 这将导致一个相同侧的表,但没有唯一约束条件。 现在就可以这样做了:
|-------------------------------|
| tbl_object_proxy              |
| ------------------------------|
| Id (pk)| object_proxy_id (pk) |
|-------------------------------|
| 1      | 150 --               |
| 1      | 149  |= It works! The unique constraint is gone! 
| 2      | 150 --               |
| 2      | 151                  |
|-------------------------------|

详细的答案和原因描述: 一些情况下,@ElementCollection 会创建一个集合表,其中包含对引用键(集合|反向连接)的一对多关系,这会向引用另一侧表的键添加唯一约束以反映一对多关系,但我并不想要这样。所以我放弃了 @ElementCollection 并用一个带有 @JoinTable 注释的 @ManyToMany 关系来替换它。我也尝试在 @ElementCollection 中声明 @ManyToMany 关系,但它仍然向引用键添加唯一约束。

我的 Settings 类现在看起来像这样:

@Entity
@Table(name = "tbl_user_settings", uniqueConstraints = {@UniqueConstraint(columnNames={"user_id"})})
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

public class Settings
{
@Id
@SequenceGenerator(name="someSequence", sequenceName="SEQ_SOMENAME", allocationSize =1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="someSequence")
@Column(name="id")
private int setting_id;

@OneToOne
private User user;

@ManyToOne
private SomeObject someobject;

@ManyToMany
@JoinTable(
name="tbl_settings_objecteproxy_v2",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id"))
private Set<SomeObject> objectProxy;

/*...the rest...*/
}

0

我在文章和分类方面遇到了类似的问题:

public class ArticleCategoriesEntity {
    @EmbeddedId
    public ArticleCategoriesIdPk getArticleCategoriesIdPk() {
        return articleCategoriesIdPk;
    }

public void setArticleCategoriesIdPk(ArticleCategoriesIdPk articleCategoriesIdPk) {
    this.articleCategoriesIdPk = articleCategoriesIdPk;
}
...



@Embeddable
public class ArticleCategoriesIdPk implements Serializable {

public ArticleCategoriesIdPk() {
}

public ArticleCategoriesIdPk(Integer articleCategoryIdPk, Integer articleCategoryVersionFk) {
    this.articleCategoryIdPk = articleCategoryIdPk;
    this.articleCategoryVersionFk = articleCategoryVersionFk;
}

private Integer articleCategoryIdPk;

@Column(name = "article_category_id_pk")
public Integer getArticleCategoryIdPk() {
    return articleCategoryIdPk;
}

public void setArticleCategoryIdPk(Integer articleCategoryIdPk) {
    this.articleCategoryIdPk = articleCategoryIdPk;
}

private Integer articleCategoryVersionFk;

@Column(name = "article_cat_version_fk")
public Integer getArticleCategoryVersionFk() {
    return articleCategoryVersionFk;
}

public void setArticleCategoryVersionFk(Integer articleCategoryVersionFk) {
    this.articleCategoryVersionFk = articleCategoryVersionFk;
}

你需要设置嵌入式PK类的两个列的唯一性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接