我有一个名为SecurityContacts的表和另一个名为Contacts的表。他们之间的联系是ManyToOne。 SecurityContacts包含AgentContact和AuditContact的列,它们是两种不同类型的联系人。它还有一个与这两个联系人关联的security_id列。这两个联系人与Contacts的主键连接,即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;
}
}
很抱歉这么啰嗦。有人有什么想法吗?
答案 0 :(得分:0)
这一切对我来说都很正常。我怀疑问题可能出在加载/保存/更新的代码中。我测试了您的实体的精简版本,并将一个审核联系人添加到一个尚未正常工作的安全联系人。您可以take a look at the code on 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
但是,您可能会遇到其他问题。 AgentContact类上的@OneToMany(mappedBy="agentContact")
仅包含将此AgentContact作为其agentContact
属性的SecurityContacts,而不包含将其作为auditContact
的任何属性。此外,如果只是use a NamingStrategy,所有@Column(name="name with underscores")
废话都可以解除。随Hibernate提供的ImprovedNamingStrategy已经为您进行了下划线分隔的驼峰式转换。