У меня есть 2 объекта: Маршруты и Хосты. Хосты имеет поле FK route_id, ссылающееся на Маршруты PK также называется route_id. Я создаю объект Маршруты и добавляйте Хосты Объектов к его hostCollection. Затем я сохраняю Маршруты объект. Оба первичных ключа генерируются правильно, новые Маршруты запись в порядке, но У хозяев запись имеет NULL в поле route_id. Что я делаю не так?Каскад Openjpa сохраняется на чужой ключ до нуля
Routes.java:
@Entity
public class Routes implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ROUTE_ID")
private long routeId;
@Column(name="MSG_QUEUE_NAME")
private String msgQueueName;
@Column(name="RECEIPT_QUEUE_NAME")
private String receiptQueueName;
@Column(name="QM_NAME")
private String qmName;
@OneToMany(mappedBy="routeId", cascade={CascadeType.PERSIST,CascadeType.REMOVE})
private Set<Hosts> hostsCollection;
private static final long serialVersionUID = 1L;
public Routes(String mqMgrName, String msgQName, String receiptQName, Set<Hosts> newHosts)
{
this.qmName = mqMgrName;
this.msgQueueName = msgQName;
this.receiptQueueName = receiptQName;
this.hostsCollection = newHosts;
}
...
}
Hosts.java:
@Entity
public class Hosts implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="HOST_ID")
private long hostId;
@Column(name="HOST_NAME")
private String hostName;
@Column(name="KEEP_MSG")
private String keepMsg;
@Column(name="SEND_RCPT")
private String sendRcpt;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="ROUTE_ID", referencedColumnName="ROUTE_ID")
private Routes routeId;
@OneToMany(mappedBy="hostId")
private Set<Users> usersCollection;
public Hosts(String hostName, String keepMsg, String sendRcpt)
{
this.hostName = hostName;
this.keepMsg = keepMsg;
this.sendRcpt = sendRcpt;
}
...
}
Создание объектов:
public String createNewHost()
{
Set<Hosts> newHosts = new HashSet<Hosts>();
Hosts newHost = new Hosts(this.hostName, this.keepMsg, this.sendRcpt);
newHosts.add(newHost);
Routes newRoute = new Routes(this.mqMgrName, this.msgQName, this.receiptQName, newHosts);
dataBean.setCurrentRoute(newRoute);
return "ok";
}
сохраняющиеся объекты:
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void setCurrentRoute(Routes currentRoute) {
em.persist(currentRoute);
em.flush();
}