EclipseLink中的多个可写映射异常 [英] Multiple writable mappings exception in EclipseLink
问题描述
我有这些表:
我的意图是:用户可以是公司
或 code>,但每个都有一些共同点,用户名称是
电子邮件
和密码
,所以我使用JPA工具从表中生成这些实体:
Which my intention is : A user can be a company
or a person
but each one of them have something in common, as username which is the email
and password
, so I used the JPA Tools to generate the entities from the table which result on this:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String email;
private String password;
private int reputation;
//bi-directional one-to-one association to Company
@OneToOne(mappedBy="user", cascade={CascadeType.ALL})
private Company company;
//bi-directional many-to-one association to Location
@OneToMany(mappedBy="user")
private List<Location> locations;
//bi-directional one-to-one association to Person
@OneToOne(mappedBy="user")
private Person person;
//bi-directional many-to-one association to Product
@OneToMany(mappedBy="user")
private List<Product> products;
//bi-directional many-to-one association to UserType
@ManyToOne
@JoinColumn(name="type")
private UserType userType;
//bi-directional many-to-one association to UserPhone
@OneToMany(mappedBy="user")
private List<UserPhone> userPhones;
//bi-directional many-to-one association to UserPicture
@OneToMany(mappedBy="user")
private List<UserPicture> userPictures;
//bi-directional many-to-one association to UserSocialNetwork
@OneToMany(mappedBy="user")
private List<UserSocialNetwork> userSocialNetworks;
// getter and setters
}
现在,如果我尝试持久化一个用户对象,在EclipseLink中启动以下异常:
Now if I try to persist an user object launchs the follow exception in EclipseLink:
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [COMPANY.id_user]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[user]
Descriptor: RelationalDescriptor(entity.Company --> [DatabaseTable(COMPANY)])
Exception [EclipseLink-48] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [PERSON.id_user]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[user]
Descriptor: RelationalDescriptor(entity.Person --> [DatabaseTable(PERSON)])
Runtime Exceptions:
生成的映射是否错误?
我如何解决这个异常?
Is the generated mapping wrong ? How can I solve this exception ?
更新
public class Company implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id_user")
private int idUser;
private String email;
private String name;
//bi-directional many-to-one association to Area
@ManyToOne
@JoinColumn(name="area")
private Area areaBean;
//bi-directional one-to-one association to User
@OneToOne(cascade={CascadeType.ALL})
@JoinColumn(name="id_user", insertable=false, updatable=false)
private User user;
// getter and setters
}
@Entity
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id_user")
private int idUser;
@Temporal( TemporalType.DATE)
private Date birthdate;
private String gender;
private String name;
private String surname;
//bi-directional one-to-one association to User
@OneToOne
@JoinColumn(name="id_user", insertable=false, updatable=false)
private User user;
// getters and setters
}
推荐答案
正确的方法是使用 @PrimaryKeyJoinColumn
而不是纯旧的 @JoinColumn
。
The proper way to do this is to use @PrimaryKeyJoinColumn
instead of plain old @JoinColumn
.
PrimaryKeyJoinColumn上的参考wiki示例
这篇关于EclipseLink中的多个可写映射异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!