Openjpa cascade persist将外键设置为null

Openjpa cascade persist将外键设置为null,jpa,null,foreign-keys,cascade,persist,Jpa,Null,Foreign Keys,Cascade,Persist,我有两个实体:路由和主机。主机有一个FK字段route_id,引用路由的PK,也称为route_id。 我创建对象路由并将Hosts对象添加到它的hostsCollection。然后我将对象持久化。两个主键都正确生成,新路由记录正常,但Hosts记录在route_id字段中为NULL。我做错了什么 Routes.java: @Entity public class Routes implements Serializable { @Id @GeneratedValue(strat

我有两个实体:路由和主机。主机有一个FK字段route_id,引用路由的PK,也称为route_id。 我创建对象路由并将Hosts对象添加到它的hostsCollection。然后我将对象持久化。两个主键都正确生成,新路由记录正常,但Hosts记录在route_id字段中为NULL。我做错了什么

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

在Routes.hosts上,您有mappedBy=“routeId”,这意味着关系的拥有方是主机

所以,除非您在主机上设置关系,否则它不会被持久化

@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();
}