我有两个实体类。用户和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。
安置自己的代码中删除级联规则,并明确说明您认为是什么做的,它做什么代替。 –
我编辑的问题。请说如果我应该添加一些东西。 –
我已经说过了:发布你的代码,并清楚地解释你期望它做什么,以及它做了什么。 –