我是Hibernate / JPA的新手,并且在使用所有这些注释理解JPA持久性时遇到了一些问题。我有2个简单的实体,在2和I之间有OneToMany / ManyToOne关系,我不明白2之间的持久性是如何工作的。
以下是我的实体和关系:
@Entity
@Table(name = "DEVICE_TABLE")
public class DeviceEntity implements Serializable {
...
@Id
private String serialNumber;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "deviceEntity")
private Set<AlertsEntity> alerts = new HashSet<AlertsEntity>(0);
...
@Entity
@Table(name = "ALERT_TABLE")
public class AlertsEntity implements Serializable {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "serialNumber", nullable = false)
private DeviceEntity deviceEntity;
...
以下是我试图在中间使用DAO的方法:
String serialNumber = "asdf";
DeviceEntity device = new DeviceEntity(serialNumber, new HashSet<AlertsEntity>());
deviceService.addDeviceEntity(device);
AlertsEntity alertEntity = new AlertsEntity(device, "Alert1");
device.getAlerts().add(alertEntity);
alertService.addAlertsEntity(new AlertsEntity(device, "Alert2"));
List<AlertsJson> alertsFromDeviceService = deviceService.getJsonableAlerts(serialNumber);
List<AlertsJson> alertsFromAlertService = alertService.getJsonableAlerts(device);
assertEquals(2, alertsFromAlertService.size()); //passes
assertEquals(2, alertsFromDeviceService.size()); //FAILS!
现在这里是我不理解的部分......我想通过设置这两个关系,将2个实体链接在一起,所以当我从一个添加/删除时,另一个更新。
但是当我通过DeviceEntity添加警报时,警报实体会更新,但是当我通过警报实体添加警报时,设备实体不会更新。它是否正确?我错过了什么吗?如果是这种情况,那么建立警报实体和关系有什么意义呢?
- 更新:TL; DR -
这是我的主要问题:当我更新实体并设置一个标记为@ManyToOne的字段时,它会自动保留到与其链接的另一个表吗?
因此,在上面的示例中,如果我创建一个新的AlertEntity并设置DeviceEntity字段,当我说DeviceEntity.getAlerts()时,我的Set内部是否会在DeviceEntity中提供此警报?