Hibernate mappingexception with @onetoone mapping relationship with one @JoinColumn and two primary keys

I had problem in hibernate in @OnetoOne mapping where class A has one primary and this primary key references foreign key in class B. Class B had composite key combination of one foreign key. Here is my code,please help me…

@Entity
public class Users {

    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "users_seq")
    private long id;

   @Id
   private String username;

   private String password;

   private boolean is_delete;

   private Timestamp created_time;

  private boolean is_change_requested = true;

  public Users() {};

  public Users(long id, String username, String password, boolean is_delete, Timestamp created_time,
		boolean is_change_requested) {
	   this.id = id;
	   this.username = username;
	   this.password = password;
	   this.is_delete = is_delete;
	   this.created_time = created_time;
	   this.is_change_requested = is_change_requested;
   }

   @OneToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "username")
   private Roles roles = new Roles();
}

  @Entity
  @Table(name = "user_roles")
  public class Roles{

   @EmbeddedId
   private RolesPkey pkey;

   @OneToOne(mappedBy = "roles")
   private Users users = new Users();

   public Roles() {
   }
}

@Embeddable
public class RolesPkey implements Serializable {

   private int role_id;

   private String username;

   public int getRole_id() {
	return role_id;
   }

   public void setRole_id(int role_id) {
	this.role_id = role_id;
   }

   public String getUsername() {
	return username;
   }

   public void setUsername(String username) {
	   this.username = username;
   }

}


     Caused by: org.hibernate.MappingException: broken column mapping for: roles.id of: 
 com.sdri.models.Users
at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:311) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.AbstractPropertyMapping.initIdentifierPropertyPaths(AbstractPropertyMapping.java:404) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.AbstractPropertyMapping.initPropertyPaths(AbstractPropertyMapping.java:365) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.initOrdinaryPropertyPaths(AbstractEntityPersister.java:2551) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.initPropertyPaths(AbstractEntityPersister.java:2598) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.postConstruct(AbstractEntityPersister.java:4266) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:452) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_271]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_271]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:1.8.0_271]
at java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:1.8.0_271]
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:96) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:77) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.metamodel.internal.MetamodelImpl.initialize(MetamodelImpl.java:181) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:301) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:616) ~[spring-orm-5.3.3.jar:5.3.3]
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:600) ~[spring-orm-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784) ~[spring-beans-5.3.3.jar:5.3.3]
... 84 common frames omitted

The @Id annotation should only be used to declare the primary key. Just mark the username as unique if you want this constraint, but the primary key should be just the sequence id. I’ll just assume that you want to map role assignments through username. Note though that you need a collection/join table between the user and role tables to model a many-to-many association. You will need something like this:

@Entity
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "users_seq")
    private long id;
    @Column(unique = true)
    private String username;
    private String password;
    private boolean is_delete;
    private Timestamp created_time;
    private boolean is_change_requested = true;
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_roles", joinColumns = {
        @JoinColumn(name = "username", referencedColumnName = "username")
    })
    private Set<Roles> roles = new HashSet<>();
}

@Entity
public class Roles {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "roles_seq")
    private long id;
    private String name;
}