1

レガシー データベースには、Users、Workgroups、UsersWorkgroup の 3 つのテーブルがあります。UsersWorkgroup は、ユーザーがワークグループで持つロールを保存します。関連するコード スニペットは次のとおりです。

@Entity
@Table(name = "users_workgroup")
public class UsersWorkgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    protected UsersWorkgroupPK usersWorkgroupPK;

    @JoinColumn(name = "idworkgroup", referencedColumnName = "idworkgroup")
    @ManyToOne(optional = false)
    private Workgroup workgroup;
    @JoinColumn(name = "user_name", referencedColumnName = "user_name")
    @ManyToOne(optional = false)
    private Users users;

    @Column(name = "role")
    private Integer role;


@Embeddable
public class UsersWorkgroupPK implements Serializable {

    @Basic(optional = false)
    @Column(name = "idworkgroup", insertable=false, updatable=false)
    private int idworkgroup;
    @Basic(optional = false)
    @Column(name = "user_name", insertable=false, updatable=false)
    private String userName;


@Entity
@Table(name = "workgroup")
public class Workgroup implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idworkgroup")
    private Integer idworkgroup;
    @Column(name = "name")
    private String name;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idworkgroup")
    private Collection<UsersWorkgroup> usersWorkgroupCollection;

そしてもちろん、問題は、それが機能しないことです。現在、私はこの例外を受け取ります:

例外の説明: [class entity.Workgroup] と [class entity.UsersWorkgroup] の間で互換性のないマッピングが発生しました。これは通常、マッピングのカーディナリティがそのバックポインタのカーディナリティと一致しない場合に発生します。

OneToMany は ManyToOne と一致する必要があるため、わかりません... それとも、ManyToMany の関係ですか? @ManyToMany に切り替えると、次のようになります。

例外の説明: クラス [class com.ericsson.rsg.ejb.entity.UsersWorkgroup] の関係属性 [workgroup] のターゲット エンティティを特定できません。ジェネリックを使用しない場合は、ターゲット エンティティが関係マッピングで定義されていることを確認してください。

複合キー (埋め込み) を理解しようとしていますが、見つけたすべての例には、外部キーではない単純な列しかありません (しかし、それが複合キーの要点ですよね?)。UsersWorkgroup テーブルを密かに結合テーブルにすることはできますか?

PK クラスを厳密な POJO クラスとして宣言する必要がありますか? または @JoinColumn アノテーションを PK クラスに入れる必要がありますか? 別のテーブルから複合キー内の列を参照するにはどうすればよいですか? 参照するクラス コンストラクターで PK オブジェクトを初期化する必要がありますか?それとも不要ですか?

私は完全に立ち往生しているように感じます。

4

2 に答える 2

1

まず第一に、ユーザーは多くのグループに属することができ、グループは多くのユーザーを持つことができるので、あなたの関係は多対多だと思います(または私はそう思います)。

次に、私が知る限り、id_workgroupとuser_nameの両方をJoinColumnsとして参照する必要があります。これらは、PKとユニットの一部であるため、両方を参照する必要があります。

また、埋め込みPK、およびゲッター/セッターに「equals」メソッドと「hashCode」メソッドがありません。必須だと思います。

于 2010-07-02T10:50:57.400 に答える
0

マッピングは次の点を除いて問題ないように見えますmappedBy-それは列名ではなくプロパティ名でなければなりません:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "workgroup") 
private Collection<UsersWorkgroup> usersWorkgroupCollection; 
于 2010-07-02T11:04:33.537 に答える