2016-04-08 15 views
1

私は自分のアプリケーションに助けが必要です。多対多の自己参照休止アノテーション(2つのエンティティで)

私はHibernate+Postgresql + Mavenを使用しています。

@ManyToManyアノテーションなしでデータベースに多数のリレーションシップを作成したいのですが、@OneToManyアノテーションは2つありますが、いくつか問題があります。私はUserエンティティとFriendshipエンティティを持っています。

@Entity 
@Table(name="USER") 
@SuppressWarnings("unused") 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name="USER_ID") 
    private Long user_id; 
    @Column(name="NAME") 
    private String name; 
    @Column(name="SOURNAME") 
    private String sourname; 
    @Column(name="BIRTHDAY") 
    private String birthday; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user1", cascade= CascadeType.ALL) 
    private Set<Friendship> friendship = new HashSet<Friendship>(0); 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.user2") 

    private Set<Friendship> friendships = new HashSet<Friendship>(0); 
//getters and setters 
} 
@Entity 
@Table(name="FRIENDSHIP") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.user1", joinColumns = @JoinColumn(name = "user_id")), 
     @AssociationOverride(name = "pk.user2", joinColumns = @JoinColumn(name = "user_id")) }) 
@SuppressWarnings("unused") 
public class Friendship { 
    @EmbeddedId 
    private FriendshipId pk = new FriendshipId(); 
    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "CREATED_DATE", nullable = false, length = 10) 
    private Date createdDate; 


    public FriendshipId getPk() { 
     return pk; 
    } 

    public void setPk(FriendshipId pk) { 
     this.pk = pk; 
    } 

    public Date getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    @Transient 
    public User getUser1(){return getPk().getUser1();} 

    @Transient 
    public User getUser2(){ 
     return getPk().getUser2(); 
    } 

    public void setUser1(User user1){ getPk().setUser1(user1); } 

    public void setUser2(User user2){getPk().setUser2(user2);} 

} 
@Embeddable 
public class FriendshipId implements Serializable{ 
    @ManyToOne 
    private User user1; 
    @ManyToOne 
    private User user2; 

    public User getUser1() { 
     return user1; 
    } 

    public void setUser1(User user1) { 
     this.user1 = user1; 
    } 

    public User getUser2() { 
     return user2; 
    } 

    public void setUser2(User user2) { 
     this.user2 = user2; 
    } 


    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     FriendshipId that = (FriendshipId) o; 

     if (user1 != null ? !user1.equals(that.user1) : that.user2 != null) return false; 
     if (user2 != null ? !user2.equals(that.user2) : that.user2 != null) return false; 

     return true; 
    } 

    public int hashCode() { 
     int result; 
     result = (user1 != null ? user1.hashCode() : 0); 
     result = 31 * result + (user2 != null ? user2.hashCode() : 0); 
     return result; 
    } 

} 

と私は、このスタックトレースを持っている:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: model.Friendship column: user_id (should be mapped with insert="false" update="false") 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:696) 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:737) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:493) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1324) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1782) 

は私を助けて!

UPD:今

@Entity 
@Table(name="FRIENDSHIP") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.user1", joinColumns = @JoinColumn(name = "user_id_1")), 
     @AssociationOverride(name = "pk.user2", joinColumns = @JoinColumn(name = "user_id_2")) }) 
@SuppressWarnings("unused") 
public class Friendship 

とスタックトレース:

INFO: HHH000227: Running hbm2ddl schema export 
Hibernate: alter table FRIENDSHIP drop constraint FK_82a932pmyph72ritrnbumysli 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table FRIENDSHIP drop constraint FK_82a932pmyph72ritrnbumysli 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: constraint "fk_82a932pmyph72ritrnbumysli" in table "friendship" not exist 
Hibernate: alter table FRIENDSHIP drop constraint FK_nlu74mncjyeaokaaj0c5eomrp 
Hibernate: drop table if exists FRIENDSHIP cascade 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table FRIENDSHIP drop constraint FK_nlu74mncjyeaokaaj0c5eomrp 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: constraint "fk_nlu74mncjyeaokaaj0c5eomrp" in table "friendship" not exist 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: drop table if exists USER cascade 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
Hibernate: drop table if exists USER cascade 
ERROR: syntax error (approximate location: "USER") 
    Position: 22 
Hibernate: drop sequence hibernate_sequence 
Hibernate: create table FRIENDSHIP (CREATED_DATE timestamp not null, user_id_2 int8, user_id_1 int8, primary key (user_id_1, user_id_2)) 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: create table USER (USER_ID int8 not null, BIRTHDAY varchar(255), NAME varchar(255), SOURNAME varchar(255), primary key (USER_ID)) 
Hibernate: create table USER (USER_ID int8 not null, BIRTHDAY varchar(255), NAME varchar(255), SOURNAME varchar(255), primary key (USER_ID)) 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
Hibernate: alter table FRIENDSHIP add constraint FK_82a932pmyph72ritrnbumysli foreign key (user_id_2) references USER 
ERROR:syntax error (approximate location: "USER") 
    Position: 14 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table FRIENDSHIP add constraint FK_82a932pmyph72ritrnbumysli foreign key (user_id_2) references USER 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: syntax error (approximate location: "USER") 
    Position: 103 
Hibernate: alter table FRIENDSHIP add constraint FK_nlu74mncjyeaokaaj0c5eomrp foreign key (user_id_1) references USER 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: HHH000389: Unsuccessful: alter table FRIENDSHIP add constraint FK_nlu74mncjyeaokaaj0c5eomrp foreign key (user_id_1) references USER 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport perform 
ERROR: syntax error (approximate location: "USER") 
    Position: 103 
Hibernate: create sequence hibernate_sequence 
апр 08, 2016 10:21:26 AM org.hibernate.tool.hbm2ddl.SchemaExport execute 
INFO: HHH000230: Schema export complete 

答えて

1

私はあなたが外部キー列user_id_1に異なる名前を使用する必要があり、この

@AssociationOverrides({ 
     @AssociationOverride(name = "pk.user1", joinColumns = @JoinColumn(name = "user_id")), 
     @AssociationOverride(name = "pk.user2", joinColumns = @JoinColumn(name = "user_id")) }) 

に問題があることを考えて、user_id_2

@AssociationOverrides({ 
     @AssociationOverride(name = "pk.user1", joinColumns = @JoinColumn(name = "user_id_1")), 
     @AssociationOverride(name = "pk.user2", joinColumns = @JoinColumn(name = "user_id_2")) }) 

Userのような表に名前を付けないでください。 UserはPostSQLの予約キーワードです。接頭辞がxxx_usersの小文字の複数の名前を使用してください。

他の便利な接頭辞と名前付け方法については、StrategyOptions,Hibernate5NamingStrategyをご覧ください。

+0

これを実行して新しいエラーが発生しました。ルックアップを見てください。 –

+0

@АндрейБугаковもっと簡単なことができます:)私は更新します。 –

関連する問題