Hibernate не соответствует значениям в базе данных - PullRequest
0 голосов
/ 01 августа 2011

У меня есть таблица с именем SecurityContacts и другая таблица с именем Contacts. Ассоциация между ними - ManyToOne. SecurityContacts имеет столбцы для AgentContact и AuditContact, которые представляют собой два разных типа контактов. У этого также есть столбец для security_id, связанного с обоими этими контактами. Эти два контакта соединяются с первичным ключом Контактов, который является contact_id.

Вот пример проблемы: предположим, что запись в SecurityContact существует следующим образом: AgentContact = 5, AuditContact = NULL, security_id = 1000. Вы пытаетесь установить AuditContact этой существующей записи как 6. Hibernate создает вторую запись следующим образом: AgentContact = Null, AuditContact = 6, security_id = 1000. Что должно произойти, так это то, что существующая запись должна быть изменена так: AgentContact = 5, AuditContact = 6, security_id = 1000.

Интересно то, что если AgentContact и AuditContact уже имеют какое-либо существующее значение в Contact, а не NULL, обновление работает должным образом. Это приводит меня к мысли, что это может быть проблема внешнего / внутреннего соединения. Вот код для моей таблицы SecurityContacts:

/**
 * 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 = "" + securityContactId;
        }
        return uid;
    }

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

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

    @Column(name="security_id")
    private String 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 getSecurityContactId() {
        return this.securityContactId;
    }

    public void setSecurityContactId(Long securityContactId) {
        this.securityContactId = securityContactId;
    }

    public String getSecurityId() {
        return this.securityId;
    }

    public void setSecurityId(String 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="parent", property="contactId")
    public AgentContact getAgentContact() {
        return this.agentContact;
    }

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

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

} 

Вот код для моей таблицы контактов:

/**
 * 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="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="parent", 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;
    }


}

Извините за то, что был таким скучным. У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 01 августа 2011

Это все выглядит вполне нормально для меня.Я подозреваю, что проблема может быть в коде, который выполняет загрузку / сохранение / обновление.Я протестировал урезанную версию ваших сущностей, и добавление аудиторского контакта к контакту безопасности, у которого его еще нет, работает нормально.Вы можете взглянуть на код на github или просто клонировать проект и запустить его самостоятельно:

git clone git://github.com/zzantozz/testbed.git tmp
cd tmp
mvn compile exec:java -Dexec.mainClass=rds.hibernate.MultipleManyToOnes -pl hibernate-multi-many-to-ones

Возможно, у вас другая проблема.Ваш @OneToMany(mappedBy="agentContact") в классе AgentContact будет содержать только SecurityContacts, у которых этот AgentContact является свойством agentContact, а не любой, у которого он имеет auditContact.Кроме того, от всей этой @Column(name="name with underscores") ерунды можно избавиться, если вы просто используете NamingStrategy . ImprovedNamingStrategy , поставляемый с Hibernate, уже выполняет преобразование "верблюжий случай в подчеркивание".

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