2011-03-10 18 views
2

特定の関係のJPAマッピングに問題があります。JPAマッピング - 関係の複合キー

USER 
USER_SERIAL_NUMBER VARCHAR(20) not null, 
..... VARCHAR(4) not null, 
..... VARCHAR(3) not null, 
..... VARCHAR(10) not null, 
primary key (USER_SERIAL_NUMBER) 
); 
OFFICE (
OFFICE_SERIAL_NUMBER VARCHAR(20) not null, 
TOWN VARCHAR(15) not null, 
YEAR VARCHAR(4) not null, 
DESCRIPTION VARCHAR(200) not null, 
NOTE VARCHAR(100) not null, 
CREATION_DATE DATE not null, 
LAST_UPDATE_DATE DATE not null, 
primary key (OFFICE_SERIAL_NUMBER) 
); 

ROLE_TYPE (
ROLE_ID BIGINT not null, 
DESCRIPTION VARCHAR(20) not null, 
CREATION_DATE DATE not null, 
LAST_UPDATE_DATE DATE not null, 
primary key (ROLE_ID) 
); 

と私は3外部キーとローカルキーと複合キーを持っている関係テーブルでリレーションテーブル

ROLE (
ROLE_ID BIGINT not null, 
USER_SERIAL_NUMBER VARCHAR(20) not null, 
OFFICE_SERIAL_NUMBER VARCHAR(20) not null, 
YEAR VARCHAR(4) not null, 
CREATION_DATE DATE not null, 
LAST_UPDATE_DATE DATE not null, 
primary key (ROLE_ID, USER_SERIAL_NUMBER, OFFICE_SERIAL_NUMBER, YEAR) 
); 

(:私のMySQLデータベースで 私は関係の3エンティティを持っています年)、 特定の年に特定のオフィスでより多くの(異なる)役割を持つことができますが、おそらく来年は変わります(歴史的役割を果たしなければなりません)。

エンティティでこれらのテーブルをマップする試みがたくさんありましたが、すべてがうまく動作するように適切な組み合わせが見つかりませんでした。

私は双方向で関係を移動したいので、特定のオフィスで特定の役割を果たすユーザーとその数を知る必要がありますが、特定のオフィスで何人のオフィスが何人いるか知る必要がありますユーザー、そして彼が持つ役割ここで

は、Javaコードです:

@Entity 
@Scope(ScopeType.CONVERSATION) 
@Name("role") 
@Table(name = "ROLE") 
@IdClass(RolePK.class) 
public class Role implements Serializable { 

private static final long serialVersionUID = 111111111L; 

@Id 
@OneToOne 
@Column(name="USER_SERIAL_NUMBER") 
private User User; 

@Id 
@OneToOne 
@Column(name="OFFICE_SERIAL_NUMBER") 
private Office office; 

@Id 
@OneToOne 
@Column(name="ROLE_ID") 
private RoleType roleType; 

@Id 
@Column(name = "YEAR", length = 4, nullable = false) 
private String year; 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "CREATION_DATE", nullable = false) 
private Date creationDate; 

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "LAST_UPDATE_DATE", nullable = false) 
private Date lastUpdateDate; 

… getter and setter … 
… equals and hash code … 
… toString … 
} 

@Name("rolePK") 
public class RolePK implements Serializable { 

private static final long serialVersionUID = 2222222222222L; 

private String office; 
private Long roleType; 
private String User; 
private String year; 

public RolePK() { 

… getter and setter … 
… equals and hash code … 
… toString … 
} 
@Entity 
@Scope(ScopeType.CONVERSATION) 
@Name("user") 
@Table(name = "USER") 
public class User implements Serializable { 

private static final long serialVersionUID = 333333333333L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "USER_SERIAL_NUMBER", length = 20, nullable = false) 
private String serialNumber; 

… other properties… 

@OneToMany(mappedBy="user") 
private Collection<Role> roleCollection; 

… getter and setter … 
… equals and hash code … 
… toString … 


@Entity 
@Scope(ScopeType.CONVERSATION) 
@Name("office") 
@Table(name = "OFFICE") 
public class Office implements Serializable { 

private static final long serialVersionUID = 55555555555555555L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name="OFFICE_SERIAL_NUMBER", length=20, nullable=false) 
private String officeSerialNumber; 
… other properties… 

@OneToMany(mappedBy="office") 
private Collection<Role> roleCollection; 

… getter and setter … 
… equals and hash code … 
… toString … 

@Entity 
@Scope(ScopeType.CONVERSATION) 
@Name("roleType") 
@Table(name = "ROLE_TYPE") 
public class RoleType implements Serializable { 

private static final long serialVersionUID = 44444444444444444L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "ROLE_TYPE_ID", nullable = false) 
private Long id; 
… other properties… 

@OneToMany(mappedBy="roleType") 
private Collection<Role> roleCollection; 

… getter and setter … 
… equals and hash code … 
… toString … 

私は(私はすでに前にしようとした)このソリューションを実装しようとしたが、私はまだ設定の問題を抱えています。 この特定の構成では、Hibernateがクエリを作成しようとすると、適切なクエリを生成できないように見えるというエラーがあります。 特に、関係テーブルの列の名前と同じでないプロパティの名前があります。 注釈を使用してプロパティをバインドする列の名前を指定しようとしましたが、列の名前ではなくプロパティ名を使用してクエリが生成されます。したがって、システムは例外をスローします。具体的には、次のようになります。com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 'columnco0_.user'フィールドのリストが不明です。

誰かが私を助けることができますか? ありがとうございます

答えて

4

ロールテーブルに自動生成されたIDと、タプルの一意制約(roleId、use、office、year)を導入しないのはなぜですか?これは、はるかに簡単にsthingsになります。

この複合主キーを継続したい場合は、http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-idを読んでください。これは、関連付けを含む埋め込みIDの例で終わります。ただし、ユーザー(たとえば)が複数の役割で参照されるため、OneToOneではなくManyToOneである必要があります。

あなたは、このように持っている必要があり

@Embeddable 
public class RoleId { 
    @ManyToOne 
    private User user; 

    @ManyToOne 
    private Office office; 

    @ManyToOne 
    private RoleType roleType; 

    private int year; 

    // constructor, getters, equals, hashCode 
} 

@Entity 
public class Role { 
    @EmbeddedId 
    private RoleId id; 

    private Date creationDate; 
    // ... 
} 
関連する問題