Hibernate назначает неверные идентификаторы базы данных - PullRequest
1 голос
/ 18 июля 2011

Вот ситуация: у меня есть таблица сопоставления, назовем ее SecurityContact, с тремя столбцами.

  1. Первый столбец (назовем его security_id) содержит первичный ключ для SecurityContact. Hibernate успешно генерирует идентификационный номер для этого столбца.
  2. Второй столбец (назовем его agent_id) содержит значение первичного ключа второй таблицы (назовем его AgentContact), столбец первичного ключа которого называется contact_id. Этот столбец agent_id со ссылочным столбцом contact_id, как вы уже догадались, является одним из столбцов соединения между SecurityContact и AgentContact.
  3. Третий столбец SecurityContact (назовем его audit_id) также содержит значение первичного ключа AgentContact. Это также столбец соединения между SecurityContact и AgentContact, с вновь указанным столбцом contact_id в AgentContact. Отношения между записями в SecurityContact и записями в AgentContact многие к одному.

Таким образом, в основном эта таблица SecurityContact соединяет agent_id и audit_id с security_id. agent_id и audit_id могут быть одинаковыми или разными, в зависимости от того, являются ли две записи в AgentContact одинаковыми или разными.

Теперь вот проблема: даже когда две записи различны, Hibernate, похоже, ставит одинаковый идентификатор для них обоих, этот идентификатор является contact_id для AuditContact SecurityContact. Эти две записи должны быть разными, с agent_id, содержащим contact_id агента, и audit_id, содержащим contact_id аудита (из той же таблицы, AgentContact). У кого-нибудь есть идеи, почему?

Приношу свои извинения за то, что так долго волновался. Вот код для 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;
    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...