Java Hibernate取消表中列的唯一性 Hibernate取消表中列的唯一性(已解决)

Java Hibernate取消表中列的唯一性 Hibernate取消表中列的唯一性(已解决),java,database,hibernate,postgresql,hql,Java,Database,Hibernate,Postgresql,Hql,我希望一个字段集本身是非唯一的,但与另一个字段组合时是唯一的,我得到了这个有两列的表(复合主键);id(主键)和object_proxy_id(主键),这正是我需要的,但是hibernate将object_proxy_id设置为自身唯一,这样表中的值就不能重复,我需要此列来接受重复的值。因为每个用户都有自己的对象代理,这些代理不一定是唯一的 这就是我想要实现的目标: |-------------------------------| | tbl_object_proxy

我希望一个字段集本身是非唯一的,但与另一个字段组合时是唯一的,我得到了这个有两列的表(复合主键);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              |
| ------------------------------|
| 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 !!!!
|------------------|
@实体
@表(name=“tbl_user_settings”,uniqueConstraints={@UniqueConstraint(columnNames={“user_id”})})
@继承(策略=继承类型。每个类的表)
公共类设置实现可序列化
{
@身份证
@SequenceGenerator(name=“someSequence”,sequenceName=“SEQ_SOMENAME”,allocationSize=1)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“someSequence”)
@列(name=“id”)
私有int设置_id;
@奥内托内
私人用户;
@许多酮
私人某物某物;
@元素集合
@CollectionTable(name=“tbl\u collection\u name”,joinColumns=
@JoinColumn(name=“id”),uniqueConstraints={@UniqueConstraint(columnNames={“id”,“object_proxy_id”})
@列(name=“SomeObject”)
私有集对象代理;
/*…构造函数和方法*/
}
结果为:

|-------------------------------|
| 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_用户_设置|
|-------------------|                        
|id | PK
|用户id | FK参考tbl |用户
|对象id | FK参考tbl |对象
|-------------------|
|------------------|
|tbl_对象_代理|
|------------------|
|id | PK参考tbl_用户设置
|object_proxy_id | PK reference tbl_object但我不希望它本身是唯一的!!!!
|------------------|
编辑: tbl_对象_代理中的两个主键是复合主键

我尝试过Xeon的解决方案,但没有成功。

我对文章和类别也有类似的问题:

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类的两列的唯一性:

简短回答:
@JoinTable
@ElementCollection
替换为
@manytomy
关系,如下所示:

@ManyToMany
@JoinTable(
name="tbl_settings_objecteproxy_v2",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id"))
private Set<SomeObject> objectproxy;
@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...*/
}


详细答案和原因说明: 不知何故,
@ElementCollection
创建了一个collectiontable,其中引用键的一对多关系(collection | inverse join)为引用另一边表的键添加了一个唯一约束,以反映我不想要的一对多关系。因此,我删除了
@ElementCollection
,并将其替换为带有
@JoinTable
注释的
@manytomy
关系。我还尝试在
@ElementCollection
中声明
@manytomy
关系,但它一直在向引用的键添加唯一约束

我的设置类现在看起来是这样的:

@ManyToMany
@JoinTable(
name="tbl_settings_objecteproxy_v2",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn( name = "objectproxy_id"))
private Set<SomeObject> objectproxy;
@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...*/
}
@实体
@表(name=“tbl_user_settings”,uniqueConstraints={@UniqueConstraint(columnNames={“user_id”})})
@继承(策略=继承类型。每个类的表)
公共类设置
{
@身份证
@SequenceGenerator(name=“someSequence”,sequenceName=“SEQ_SOMENAME”,allocationSize=1)
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“someSequence”)
@列(name=“id”)
私有int设置_id;
@奥内托内
私人用户;
@许多酮
私人某物某物;
@许多
@可接合(
name=“tbl\u设置\u objecteproxy\u v2”,
joinColumns=@JoinColumn(name=“id”),
inverseJoinColumns=@JoinColumn(name=“objectproxy\u id”))
私有集对象代理;
/*……其余的*/
}

您是在谈论复合主键吗?是的,我是在谈论复合主键我已经编辑了我的问题