2017-02-18 18 views
0

私は2つのエンティティクラスを持っています。ユーザーとFriendStatus.Friendステータスは、別のユーザーからのフレンドリクエストに関するデータを保持します。hibernate @onetomany双方向マッピングでデータが正しくマッピングされない

ユーザー:

@Entity 
@Table(name = "USERS") 
@XmlRootElement 
public class User implements Serializable { 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "acceptor") 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<Message> acceptedMessages; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "sender") 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<Message> sentMessages; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 
private String username; 
private String password; 

@Column(name = "phone_number") 
private String phoneNumber; 

@OneToMany(cascade = CascadeType.ALL) 
@LazyCollection(LazyCollectionOption.FALSE) 
private List<User> friends; 

@OneToMany(cascade = CascadeType.ALL,mappedBy="requestAcceptor") 
@LazyCollection(LazyCollectionOption.FALSE) 
@JsonIgnoreProperties("requestAcceptor") 
private List<FriendStatus> acceptedFriendRequests; 

@OneToMany(cascade = CascadeType.ALL,mappedBy = "requestSender") 
@LazyCollection(LazyCollectionOption.FALSE) 
@JsonIgnoreProperties("requestSender") 
private List<FriendStatus> sentFriendRequests; 

@Column(name = "profile_status") 
private String profileStatus; 

@Enumerated(EnumType.STRING) 
@Column(name = "activation_status") 
private UserActivationStatus activationStatus; 

FriendStatus:

@Entity 
@Table(name="FRIEND_STATUS") 
public class FriendStatus implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private long Id; 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name="request_sender_id") 
@JsonIgnoreProperties("sentFriendRequests") 
private User requestSender; 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name="request_acceptor_id") 
@JsonIgnoreProperties("acceptedFriendRequests") 
private User requestAcceptor; 

@Enumerated(EnumType.STRING) 
@Column(name = "request_status") 
private FriendRequestStatus friendRequestStatus; 

すると私は同じrequestAcceptorオブジェクトで2回目のオブジェクトを保存するとき、それはfine.Butの作品データベースへFriendStatusオブジェクトの保存初めて、休止状態request_acceptor_id列から前のIDを削除し、新しい行に書き込みます。私にお願いします。

EDIT:

これは私のオブジェクトをdbに保存する方法です。

public T create(T object) { 
T objectFromDB = object; 
Session session = NewHibernateUtil.getSessionFactory().openSession(); 
Transaction transaction = null; 
try { 
    transaction = (Transaction) session.beginTransaction(); 
    session.save(object);   
    transaction.commit(); 

} catch (HibernateException e) { 
     if (session != null){ 
       session.getTransaction().rollback(); 
      } 
    e.printStackTrace(); 
} finally { 
    session.close(); 
} 
return objectFromDB; 
} 

これは私がメソッドを作成して呼び出す方法です:

public void sendFriendRequest(FriendStatus object) { 
    FriendStatus status = fDao.create(object);//fDao is the object from Dao class which includes create method. 
} 

これは私のコントローラです:

@RequestMapping(value="/sendFriendRequest",method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON,produces = MediaType.APPLICATION_JSON) 
public String sendFriendRequest(@RequestBody FriendStatus status) { 
    serviceUser.sendFriendRequest(status);//serviceUser is the object from class that includes sendFriendRequest method. 
    return "OK"; 
} 

これはデシベルで私のテーブルです:

+====+================+=====================+===================+ 
| id | request_status | request_acceptor_id | request_sender_id | 
+====+================+=====================+===================+ 
| 18 | WAITING  | NULL    |    29 | 
+----+----------------+---------------------+-------------------+ 
| 19 | WAITING  | 23     |    30 | 
+----+----------------+---------------------+-------------------+ 

FriendStatusオブジェクトを保存すると(fr om client)のIDが29で、IDが23のrequestAcceptorオブジェクトがhibernateによってID 18のカラムに保存されます。その後、IDが30のrequestSenderで2番目のFriendStatusオブジェクトを保存し、idが23のrequestAcceptorオブジェクトを保存すると、 request_acceptor_idを、IDが18の行のNULLに置き換え、次にrequest_acceptor_idが23.butである新しい行をデータベースに作成します.2番目のオブジェクトを追加すると、最初のオブジェクトは変更されません。request_acceptor_idを同じrequest_acceptor_idで新しい列を作成するとNULLになります。あなたのカスケード設定を行うには

+0

そうでないあなただけのコレクションからのカスケードルールを削除することができ@OneToMany、Cascade.All

のポイントだったと思います代わりに。 –

+0

私は質問を編集しました。私は何かを加えるべきかどうかを言ってください。 –

+0

私は既に言っています:あなたのコードを投稿し、それが何をするのか、それが何をするのかを明確に説明してください。 –

答えて

0

その、保存するには、次を使用して

試してみてください。

public void sendFriendRequest(FriendStatus status) { 

    User requester=userDao.findOne(status.getRequestAcceptor.getId()); 
    User sender=userDao.findOne(status.getRequestSender.getId()); 
    ...... 
    statusDao.create(status); 
    status.getRequestAcceptor(requester); 
    status.getRequestSender(sender); 
    statusDao.update(status); 

} 

ステータスが運んでいることをユーザーがプライベートリストsentFriendRequestsとプライベートリストacceptedFriendRequestsを持っています。リストに

を空に設定あなたの取引が全体の関数の外にある場合、それはさらに良くうまくいくOfcause、あなたが使用することができます。。 sender.getSentFriendRequests()(ステータス)を追加し、reqester.getacceptedFriendRequests()(ステータス)を追加します。これは私はあなたのコードを投稿し、明確にあなたがそれを行うことを期待するかを説明し、どのようなそれがない

+0

fantactic !!!出来た !!どうもありがとうございました –

関連する問題