6

テーブル内の列をHibernateUnUniqueify(解決済み)


フィールドセット自体を一意ではなく、他のフィールドと組み合わせて一意にするために、2つの列(複合主キー)を持つこのテーブルを取得しました。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の2つの主キーは複合主キーです。Xeon
のソリューションを試しましたが、機能しませんでした。

4

2 に答える 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 Annotation ドキュメントの「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参照されたキー (コレクション | 逆結合)の 1 対多の関係を持つコレクション テーブルを作成しましたしたくない。そのため、 を削除して、注釈付きのリレーションに@ElementCollection置き換えました。で関係を宣言しようとしましたが、参照されたキーに Unique 制約を追加し続けました。@ManyToMany@JoinTable@ManyToMany@ElementCollection

私の設定クラスは次のようになります。

@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...*/
}
于 2012-05-22T09:24:41.467 に答える
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 クラスの 2 つの列の一意性を設定する必要があります。

于 2012-05-18T16:01:40.893 に答える