Java Hibernate取消表中列的唯一性 Hibernate取消表中列的唯一性(已解决)
我希望一个字段集本身是非唯一的,但与另一个字段组合时是唯一的,我得到了这个有两列的表(复合主键);id(主键)和object_proxy_id(主键),这正是我需要的,但是hibernate将object_proxy_id设置为自身唯一,这样表中的值就不能重复,我需要此列来接受重复的值。因为每个用户都有自己的对象代理,这些代理不一定是唯一的 这就是我想要实现的目标:Java Hibernate取消表中列的唯一性 Hibernate取消表中列的唯一性(已解决),java,database,hibernate,postgresql,hql,Java,Database,Hibernate,Postgresql,Hql,我希望一个字段集本身是非唯一的,但与另一个字段组合时是唯一的,我得到了这个有两列的表(复合主键);id(主键)和object_proxy_id(主键),这正是我需要的,但是hibernate将object_proxy_id设置为自身唯一,这样表中的值就不能重复,我需要此列来接受重复的值。因为每个用户都有自己的对象代理,这些代理不一定是唯一的 这就是我想要实现的目标: |-------------------------------| | tbl_object_proxy
|-------------------------------|
| 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”))
私有集对象代理;
/*……其余的*/
}
您是在谈论复合主键吗?是的,我是在谈论复合主键我已经编辑了我的问题