[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3410) @OneToMany forces unique key in @JoinTable when inverseJoinColumns = @JoinColumn(unique=false)

Martin Kovacik (JIRA) noreply at atlassian.com
Mon Nov 17 12:11:17 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3410?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=31733#action_31733 ] 

Martin Kovacik commented on HHH-3410:
-------------------------------------

Actually the schema is generated correctly. You can have user with many roles. But one role can be assigned only to one user. You should use ManyToMany instead of OneToMany mapping.

> @OneToMany forces unique key in @JoinTable when inverseJoinColumns = @JoinColumn(unique=false)
> ----------------------------------------------------------------------------------------------
>
>                 Key: HHH-3410
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3410
>             Project: Hibernate Core
>          Issue Type: Bug
>    Affects Versions: 3.2.6
>         Environment: MySQL 5.0.51b, Hibernate Core 3.2.6 GA, Hibernate Annotations 3.3.1 GA
>            Reporter: Kamil Morong
>
> Hi,
> I need to have this class composition with one to many relation:
> @Entity
> @Table(name="USER")
> public class User implements java.io.Serializable {
>     private Long id;
>     private String username;
>     private String password;
>     private Set<Role> roles = new LinkedHashSet<Role>();
>     public User() {
>     }       
>     @Id
>     @GeneratedValue(strategy = GenerationType.AUTO)
>     @Column(name = "USER_ID")
>     public Long getId() {
>         return id;
>     }
>     public void setId(Long id) {
>         this.id = id;
>     }
>     @Column(name="USERNAME", nullable=false, unique=true)
>     public String getUsername() {
>         return username;
>     }
>     public void setUsername(String userName) {
>         this.username = userName;
>     }
>     @Column(name="PASSWORD", nullable=false)
>     public String getPassword() {
>         return password;
>     }
>     public void setPassword(String password) {
>         this.password = password;
>     }
>     @CollectionOfElements
>     @OneToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE})
>     @JoinTable(name = "USER_ROLE",
>                joinColumns = @JoinColumn(name = "USER_ID", unique=false),
>                inverseJoinColumns = @JoinColumn(name = "ROLE_ID", unique=false))
>     @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
>     @LazyCollection(LazyCollectionOption.FALSE)
>     public Set<Role> getRoles() {
>         return roles;
>     }
>     public void setRoles(Set<Role> roles) {
>         this.roles = roles;
>     }
> }
> @Entity
> @Table(name="ROLE")
> public class Role implements java.io.Serializable {
>     private Long id;
>     private String name;
>     public Role() {
>     }
>     @Id
>     @GeneratedValue(strategy = GenerationType.AUTO)
>     @Column(name = "ROLE_ID")
>     public Long getId() {
>         return id;
>     }
>     public void setId(Long id) {
>         this.id = id;
>     }
>     @Column(name="NAME", nullable=false, unique=true)
>     public String getName() {
>         return name;
>     }
>     public void setName(String name) {
>         this.name = name;
>     }
> }
> This will create db tables like SQL script
> CREATE TABLE `user` (
>   `USER_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
>   `PASSWORD` VARCHAR(255) NOT NULL DEFAULT '',
>   `USERNAME` VARCHAR(255) NOT NULL DEFAULT '',
>   PRIMARY KEY (`USER_ID`),
>   UNIQUE KEY `USERNAME` (`USERNAME`)
> );
> CREATE TABLE `role` (
>   `ROLE_ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
>   `NAME` VARCHAR(255) NOT NULL DEFAULT '',
>   PRIMARY KEY (`ROLE_ID`),
>   UNIQUE KEY `NAME` (`NAME`)
> );
> CREATE TABLE `user_role` (
>   `USER_ID` BIGINT(20) NOT NULL,
>   `ROLE_ID` BIGINT(20) NOT NULL,
>   PRIMARY KEY (`USER_ID`, `ROLE_ID`),
>   UNIQUE KEY `ROLE_ID` (`ROLE_ID`),
>   KEY `FKBC16F46A1174FFAB` (`ROLE_ID`),
>   KEY `FKBC16F46AB69FC38B` (`USER_ID`),
>   CONSTRAINT `FKBC16F46AB69FC38B` FOREIGN KEY (`USER_ID`) REFERENCES `user` (`USER_ID`),
>   CONSTRAINT `FKBC16F46A1174FFAB` FOREIGN KEY (`ROLE_ID`) REFERENCES `role` (`ROLE_ID`)
> );
> Tables USER and ROLE are right, but the join table USER_ROLE still have defined UNIQUE KEY `ROLE_ID` (`ROLE_ID`).
> This causes there cannot be one user with many roles.
> There must be some bug while generating database scheme. I am not able to remove unique key.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list