2017-02-18 111 views
0

我有两个实体类。用户和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; 

当我第一次节省FriendStatus目的是它的工作原理fine.But当我保存的对象的第二时间以相同requestAcceptor对象的数据库,休眠从request_acceptor_id列删除先前的id并将其写入新行。请帮助我。

编辑:

这是我将我的对象保存到数据库的方法。

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"; 
} 

这是我在db表:

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

当我保存FriendStatus对象(它来自fr om客户端)与requestSender其中ID为29和requestAcceptor对象的ID为23 Hibernate将其保存到ID为18的列。之后,当我保存第二个FriendStatus对象与requestSender其中ID为30和requestAcceptor对象的ID为23,休眠将id为18的行中的NULL替换为request_acceptor_id,然后在db中创建新的行,其中request_acceptor_id是23.But我希望当我添加第二个对象时,第一个对象不会改变。我不想用request_acceptor_id替换NULL当我创建新的列与相同的request_acceptor_id。

+0

安置自己的代码中删除级联规则,并明确说明您认为是什么做的,它做什么代替。 –

+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()加(状态)。我的猜测是@OneToMany点,Cascade.All

否则你就刚刚从集合

+0

fantactic !!!有效 !!非常感谢你 –