Identity Server with JPA

Anonymous_Abstract

Well-known member
  • Aug 7, 2018
    6,036
    4,566
    113
    Messier 87
    podi deyak thama hari giya na. Authorization Server eka use karanava identity Server eka vidiyata. User register venakota user ekkama roles and permissions add venna ona.

    uni-directional relationships thiyenna

    User (N) ------------------ Role (M)

    Role (N) ------------------ Permission (M)

    role table
    ---------------
    101 user
    102 admin
    103 moderater

    aluthin user kenek add karanawa


    {
    "userName": "Julia Ann",
    "password": "ann1964",
    "email": "[email protected]",
    "active": "y",
    "accNonExpired": "y",
    "credentialNonExpired": "y",
    "accNonLocked": "y",


    "roles" : [
    {
    "id": 101,
    "name": "ROLE_USER",

    "permissions": [
    {
    "id": 10,
    "name": "CAN_CREATE"
    },
    {
    "id": 40,
    "name": "CAN_READ"
    }
    ]
    },


    {
    "id": 102,
    "name": "ROLE_ADMIN",


    "permissions": [
    {
    "id": 10,
    "name": "CAN_CREATE"
    },
    {
    "id": 40,
    "name": "CAN_READ"
    },
    {
    "id": 20,
    "name": "CAN_UPDATE"
    },
    {
    "id": 40,
    "name": "CAN_DELETE"
    }
    ]
    }
    ]
    }

    aluthin user kenek save karanna JPA ekin dena pre-defined save() use karanna ba karoth "PRIMARY KEY VIOLATION" ekak vena nisa.

    mata denaganna ona obala me vage ekak JPA use karala solve karala thiynavada, eka khomada

    Note - JPA nethuva native hibernate API use karala merge() METHOD ekin record eka modify karanna puluwan eth save() method ekin ba. JPA vala merge option ekak nethi hinda mokak vath karaganna beri scene ekak thiyenna.
     

    u_make_me_sick_

    Well-known member
  • Oct 1, 2011
    11,522
    7,320
    113
    Roles table ekatay, Permission table ekatay, wena wenama primary key dala, save karoth mokada wenne?
    Or JPA Query use karala save karanna puluwan wenna oni,
    kohoma unath, roles names and Id, permission names and Id aapahu save karanna oni nehe ne. eewa reference data nisa
     

    හෙනයා

    Well-known member
  • May 23, 2014
    16,730
    16,833
    113
    Kottawa
    Entity classes ටික නොදැක ඔබගේ පැනයට පිළිතුරක් දීමට අපහසුවේ.. කරුණාකර ඒ සියල්ල ඇතුලත් කර නැවත උත්සහ කරන්න..
     

    Anonymous_Abstract

    Well-known member
  • Aug 7, 2018
    6,036
    4,566
    113
    Messier 87
    Entity classes ටික නොදැක ඔබගේ පැනයට පිළිතුරක් දීමට අපහසුවේ.. කරුණාකර ඒ සියල්ල ඇතුලත් කර නැවත උත්සහ කරන්න..
    User Class
    ----------------

    @Entity
    @Table(name = "USER90",schema = Schema.TESTDB,uniqueConstraints = {
    @UniqueConstraint(name = "userName",columnNames = "USER_NAME"),
    @UniqueConstraint(name = "email",columnNames = "EMAIL")
    })
    @Getter
    @Setter
    public class User {

    @Id
    @SequenceGenerator(name = "USER_ID_GEN",sequenceName = Schema.TESTDB+".USER_ID_SEQ",initialValue = 1003,allocationSize = 1)
    @GeneratedValue(generator = "USER_ID_GEN",strategy = GenerationType.SEQUENCE)
    @Column(name = "USER_ID")
    private int userId;
    @Column(name = "USER_NAME",nullable = false)
    private String userName;
    @Column(name = "PASSWORD",nullable = false)
    private String password;
    @Column(name = "EMAIL",nullable = false)
    private String email;
    @Column(name = "ACTIVE",nullable = false)
    private String active;
    @Column(name = "ACC_NON_EXPIRED")
    private String accNonExpired;
    @Column(name = "CREDENTIAL_NON_EXPIRED")
    private String credentialNonExpired;
    @Column(name = "ACC_NON_LOCKED")
    private String accNonLocked;

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "USER_ROLE",joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},
    inverseJoinColumns = {@JoinColumn(name = "ROLE_ID",referencedColumnName = "ID")})
    private Set<Role> roles;
    }

    Role class
    ------------------

    @Entity
    @Table(name = "ROLE",schema = Schema.TESTDB,uniqueConstraints = {
    @UniqueConstraint(name = "name",columnNames = "NAME")
    })
    @Getter
    @Setter
    public class Role {

    @Id
    @Column(name = "ID")
    private long id;
    @Enumerated(EnumType.STRING)
    @Column(name = "NAME")
    private ERole name;

    // bi-directional
    /* @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<User> users;*/

    // uni-directional
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable(name = "PERMISSION_ROLE",joinColumns = {@JoinColumn(name = "ROLE_ID",referencedColumnName = "ID")},
    inverseJoinColumns = {@JoinColumn(name = "PERMISSION_ID",referencedColumnName = "ID")})
    private Set<Permission> permissions;
    }

    Permission class
    -----------------

    @Entity
    @Table(name = "PERMISSION",schema = Schema.TESTDB,uniqueConstraints = {
    @UniqueConstraint(name = "name",columnNames = "NAME")
    })
    @Getter
    @Setter
    public class Permission {

    @Id
    @Column(name = "ID")
    private long id;
    @Enumerated(EnumType.STRING)
    @Column(name = "NAME")
    private EPermission name;

    }

    Roles table ekatay, Permission table ekatay, wena wenama primary key dala, save karoth mokada wenne?
    Or JPA Query use karala save karanna puluwan wenna oni,
    kohoma unath, roles names and Id, permission names and Id aapahu save karanna oni nehe ne. eewa reference data nisa
    vena venama dala thama thiyenna. aluthin user kenek register karanakota new userta role assign karanna thamai awl yanne.

    permission names and Id aapahu save karanna oni nehe ne

    meka thamai matath denaganna ona aluthin user register karanakota oka role reference vidiya ganne khomada kiyala. othanadi venna "alter" veemak venna na aluthin save karanava mata alter venna ona

    jpql valin insert and alter query dekama eka sera ghanna kramayak na na
    ------ Post added on Mar 10, 2021 at 8:56 AM
     

    හෙනයා

    Well-known member
  • May 23, 2014
    16,730
    16,833
    113
    Kottawa
    role entity eke

    Code:
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<User> users;

    eke mapped by daala na neda? ekata daanna oni user entity class eke roles eka

    Code:
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = 'roles')
    private Set<User> users;

    dan relations tika uncomment karala run karala balanna.

    user 1k save weddi aluth roles and permissions e e table walata save welada user save wenna one naththam danata thiyena roles and permissions user_roles and role_permissions join table walata witharak add welada save wenna one?

    vena venama dala thama thiyenna. aluthin user kenek register karanakota new userta role assign karanna thamai awl yanne.

    permission names and Id aapahu save karanna oni nehe ne

    meka thamai matath denaganna ona aluthin user register karanakota oka role reference vidiya ganne khomada kiyala. othanadi venna "alter" veemak venna na aluthin save karanava mata alter venna ona

    jpql valin insert and alter query dekama eka sera ghanna kramayak na na
    ------ Post added on Mar 10, 2021 at 8:56 AM

    danata already role, permission and role_permissions tables wala already data add wela thiyenawanam user save karaddi e data yawanna oni na.. user data and assign wenna one roles tika roles array eke yawwama athi.. ethakota user table ekata data add wela user_roles join table ekata data map wei
    ------ Post added on Mar 10, 2021 at 9:19 AM
     
    Last edited:
    • Love
    Reactions: Anonymous_Abstract

    Anonymous_Abstract

    Well-known member
  • Aug 7, 2018
    6,036
    4,566
    113
    Messier 87
    role entity eke

    Code:
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<User> users;

    eke mapped by daala na neda? ekata daanna oni user entity class eke roles eka

    Code:
    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER, mappedBy = 'roles')
    private Set<User> users;

    dan relations tika uncomment karala run karala balanna.

    user 1k save weddi aluth roles and permissions e e table walata save welada user save wenna one naththam danata thiyena roles and permissions user_roles and role_permissions join table walata witharak add welada save wenna one?
    user_roles and role_permission tables vala thiyenna foreign key columns hinda mulin parent table eka save venna ona na. neththan foreign key violation ekak venava

    eke mapped by daala na neda? ekata daanna oni user entity class eke roles eka

    mapped_by eken venna anith relation eka track karana eka neda.

    mama bi-directional dala comment karala thiyena hinda confuse venna athi. uni-directional valin thiyenna eh hinda "mapped_by" use karanna ba na. eth mama bi-directional dala use karala beluwa alter venna na.


    user 1k save weddi aluth roles and permissions e e table walata save welada user save wenna one naththam danata thiyena roles and permissions user_roles and role_permissions join table walata witharak add welada save wenna one?
    ahh ow permission ona na role add vunama athi. role eka vitharak alter karagaththama athi
     

    හෙනයා

    Well-known member
  • May 23, 2014
    16,730
    16,833
    113
    Kottawa
    man hithanne mehema karaddi bidirectional daana wei..
    ah got confirmed - link

    It's a common mistake to only set one side of the relationship, persist the entity, and then observe that the join table is empty. Setting both sides of the relationship will fix this.

    bidirectional daala mappedBy dala try karala balanna..
     

    Anonymous_Abstract

    Well-known member
  • Aug 7, 2018
    6,036
    4,566
    113
    Messier 87
    man hithanne mehema karaddi bidirectional daana wei..
    ah got confirmed - link



    bidirectional daala mappedBy dala try karala balanna..
    thanks හෙනයා. oya article eka kiyewwa podi mistak ekak ban vela thiyenna Cascade Type eka Merge kara veda hari.

    @ManyToMany(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
    @JoinTable(name = "USER_ROLE",joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},
    inverseJoinColumns = {@JoinColumn(name = "ROLE_ID",referencedColumnName = "ID")})
    private Set<Role> roles;
    }
     
    • Like
    Reactions: u_make_me_sick_

    හෙනයා

    Well-known member
  • May 23, 2014
    16,730
    16,833
    113
    Kottawa
    thanks හෙනයා. oya article eka kiyewwa podi mistak ekak ban vela thiyenna Cascade Type eka Merge kara veda hari.

    @ManyToMany(cascade = CascadeType.MERGE,fetch = FetchType.EAGER)
    @JoinTable(name = "USER_ROLE",joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")},
    inverseJoinColumns = {@JoinColumn(name = "ROLE_ID",referencedColumnName = "ID")})
    private Set<Role> roles;
    }

    ela..

    habai ALL ekenuth oya wadema wenna one https://www.baeldung.com/jpa-cascade-types

    anyway ALL eka hena dangerous. parent wa delete karapu gaman childs la serama delete wela yanawa.. e nisa PERSIST, MERGE wena wenama daana eka hodai..
     
    • Love
    Reactions: Anonymous_Abstract