Java Hibernate分配不正确的数据库ID

Java Hibernate分配不正确的数据库ID,java,hibernate,Java,Hibernate,情况是这样的:我有一个映射表,我们称之为SecurityContact,有三列 第一列我们称之为security\u id,它包含SecurityContact的主键。Hibernate成功地自动生成此列的ID号。 第二列(我们称之为agent_id)包含第二个表(我们称之为AgentContact)的主键的值,该表的主键列称为contact_id。正如您可能猜到的,此agent_id列以及引用的列contact_id是SecurityContact和AgentContact之间的联接列之一。

情况是这样的:我有一个映射表,我们称之为SecurityContact,有三列

第一列我们称之为security\u id,它包含SecurityContact的主键。Hibernate成功地自动生成此列的ID号。 第二列(我们称之为agent_id)包含第二个表(我们称之为AgentContact)的主键的值,该表的主键列称为contact_id。正如您可能猜到的,此agent_id列以及引用的列contact_id是SecurityContact和AgentContact之间的联接列之一。 SecurityContactlet的第三列(我们称之为audit_id)还包含AgentContact主键的值。这也是SecurityContact和AgentContact之间的联接列,在AgentContact中引用了列contact_id。SecurityContact中的条目与AgentContact中的条目之间的关系是多对一的。 因此,基本上,此SecurityContact表将代理id和审核id连接到安全id。代理id和审核id可以相同或不同,这取决于AgentContact中的两个条目是相同还是不同

现在问题来了:即使这两个条目不同,Hibernate似乎也为这两个条目设置了相同的id,这个id是SecurityContact的auditContact的联系人id。这两个条目应该不同,agent_id包含agent的contact_id,audit_id包含来自同一个表AgentContact的审计的contact_id。有人知道为什么吗

我先为我的长篇大论道歉。以下是SecurityContact的代码:

 /**
 * The persistent class for the SecurityContact database table.
 * 
 */
@Entity
@FXClass(kind=FXClassKind.REMOTE)
public class SecurityContact implements Serializable {
    private static final long serialVersionUID = 1L;
    @Transient private String uid;
    @FXIgnore
    public String getUid() {
        if (uid == null) {
            uid = "" + securityId;
        }
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="security_id")
    private Long securityId;

    @Column(name="create_date")
    private String createDate;

    @Column(name="create_user")
    private String createUser;

    @Column(name="modify_date")
    private String modifyDate;

    @Column(name="modify_user")
    private String modifyUser;

    //bi-directional many-to-one association to AgentContact
    @ManyToOne
    @JoinColumn(name="agent_id", referencedColumnName="contact_id")
    private AgentContact agentContact;

    //bi-directional many-to-one association to AuditContact
    @ManyToOne
    @JoinColumn(name="audit_id", referencedColumnName="contact_id")
    private AgentContact auditContact;

    public SecurityContact() {
    }
    @FXKeyColumn
    public Long getSecurityId() {
        return this.securityId;
    }

    public void setSecurityId(Long securityId) {
        this.securityId = securityId;
    }

    public String getCreateDate() {
        return this.createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getCreateUser() {
        return this.createUser;
    }

    public void setCreateUser(String createUser) {
        this.createUser = createUser;
    }

    public String getModifyDate() {
        return this.modifyDate;
    }

    public void setModifyDate(String modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getModifyUser() {
        return this.modifyUser;
    }

    public void setModifyUser(String modifyUser) {
        this.modifyUser = modifyUser;
    }
    @FXManyToOne(parent="com.counterpartcontacts.entity.AgentContact", property="contactId")
    public AgentContact getAgentContact() {
        return this.agentContact;
    }

    public void setAgentContact(AgentContact agentContact) {
        this.agentContact = agentContact;
    }
    @FXManyToOne(parent="com.counterpartcontacts.entity.AgentContact", property="contactId")
    public AgentContact getAuditContact() {
        return this.auditContact;
    }

    public void setAuditContact(AgentContact auditContact) {
        this.auditContact = auditContact;
    }

}
以下是AgentContact表的代码:

/**
 * The persistent class for the AgentContact database table.
 * 
 */
@Entity
@FXClass(kind=FXClassKind.REMOTE)
public class AgentContact implements Serializable {
    private static final long serialVersionUID = 1L;
    @Transient private String uid;
    @FXIgnore
    public String getUid() {
        if (uid == null) {
            uid = "" + contactId;
        }
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="contact_id")
    private Long contactId;

    @ManyToOne
    @JoinColumn(name="bank_id")
    private Bank bank;

//  @Column(name="bank_id")
    //private String bank2;

    @Column(name="create_date")
    private String createDate;

    @Column(name="create_user")
    private String createUser;

    private String email;

    private String fax;

    @Column(name="modify_date")
    private String modifyDate;

    @Column(name="modify_user")
    private String modifyUser;

    private String name;

    private String phone;

    //bi-directional many-to-one association to SecurityContact
    @OneToMany(mappedBy="agentContact")
    private Set<SecurityContact> securityContacts;


    public AgentContact() {
    }
    @FXKeyColumn
    public Long getContactId() {
        return this.contactId;
    }

    public void setContactId(Long contactId) {
        this.contactId = contactId;
    }
    @FXManyToOne(parent="com.counterpartcontacts.entity.Bank", property="bankId")
    public Bank getBank() {
        return this.bank;
    }

    public void setBank(Bank bank) {
        this.bank = bank;
    }

    public String getCreateDate() {
        return this.createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getCreateUser() {
        return this.createUser;
    }

    public void setCreateUser(String createUser) {
        this.createUser = createUser;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFax() {
        return this.fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getModifyDate() {
        return this.modifyDate;
    }

    public void setModifyDate(String modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getModifyUser() {
        return this.modifyUser;
    }

    public void setModifyUser(String modifyUser) {
        this.modifyUser = modifyUser;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return this.phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
    @FXOneToMany(fillArguments="contactId")
    public Set<SecurityContact> getSecurityContacts() {
        return this.securityContacts;
    }

    public void setSecurityContacts(Set<SecurityContact> securityContacts) {
        this.securityContacts = securityContacts;
    }


}

SecurityContact的第三列我们称之为audit_id,它还包含SecurityContact主键的值。这是打字错误吗?我猜出来了。问题不在Hibernate端,而是在Flex端。在数据收集同步之间形成竞争条件。添加睡眠功能解决了这个问题。