I have these tables:
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 }
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 ?
Update
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 }
The proper way to do this is to use @PrimaryKeyJoinColumn
instead of plain old @JoinColumn
.
reference wiki example on PrimaryKeyJoinColumn
I solved my problem placing the insertable=false, updatable=false
in the @JoinColumn
annotation in both classes, Person and Company.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With