user3590149
user3590149

Reputation: 1605

JPA - Wrong repeated foreign key

I'm using @ElementCollectionon a set for role types but its inserting the first primary key that is being tested while it adds the third entry but is a duplicate key. Its the wrong key. I"m not sure if its in my test or essentially how I'm executing entity manager. As you can see the user_id only has the first ID and not the second id on user Role table. enter image description here enter image description here DAO

@Entity
@Table(name = "users")
public class DefaultUser implements Serializable
{
    @Id
    @SequenceGenerator(name="user_id_seq_gen", sequenceName="USER_ID_SEQ")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="user_id_seq_gen") 
    @Column(name = "user_id", nullable = false)
    @OrderColumn
    private long      user_id;

    @Column(name = "user_name")
    private String  user_name;

    @Column(name = "first_name")
    private String  firstName;

    @Column(name = "last_name")
    private String  lastName;

    @Column(name = "password")
    private String  password;



    @ElementCollection(targetClass=UserType.class, fetch = FetchType.EAGER)
    @CollectionTable(
            name="user_roles",
            joinColumns=@JoinColumn(name="user_id")
      )
    @Enumerated(EnumType.STRING)
    @Column(name="role_type")
    @OrderColumn
    private Set<UserType> userRoleSet = new HashSet<UserType>();

//getters and setters
}

Test Method

    public class UserDTOTest
    {

    JpaUserDAO userDAO = new JpaUserDAO(EntityManagerUtil.getEntityManager());

    DefaultUser user = new DefaultUser();
    user.setUser_name("user");
    user.setPassword("ddafsf");
    user.setFirstName("dadafddfsffsd");
    user.setLastName("dafddfafdfsasdf");
    Set<UserType> userTypeSet = new HashSet<UserType>();
    userTypeSet.add(UserType.BROKER);
    userTypeSet.add(UserType.SHAREHOLDER);

    user.setUserRoleSet(userTypeSet);
    userDAO.persist(user);

   //JpaUserDAO userDAO1 = new JpaUserDAO(EntityManagerUtil.getEntityManager());
    DefaultUser user2 = new DefaultUser();
    user2.setUser_name("user1");
    user2.setPassword("a342fsd");
    user2.setFirstName("some54thing");
    user2.setLastName("diff435ernt");
    Set<UserType> userTypeSet2 = new HashSet<UserType>();
    userTypeSet.add(UserType.ADMIN);

    user2.setUserRoleSet(userTypeSet2);
    userDAO.persist(user2);

        }
    }

JPA DAO

 public abstract class JpaDao<K, E> implements DAO<K, E>
    {
    protected Class<E>      entityClass;

protected EntityManager entityManager;

public JpaDao(EntityManager entityManager)
{
this.entityManager = entityManager;
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
    .getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass
    .getActualTypeArguments()[1];
}

/**
 * Create a new user record in the database.
 *
 * @param entity
 *            User to be created.
 * @return the ID of saved User.
 */
public void persist(E entity)
{
    entityManager.getTransaction().begin();
    entityManager.persist(entity);
    entityManager.getTransaction().commit();
}

public void remove(E entity)
{
    entityManager.getTransaction().begin();
    entityManager.remove(entity);
    entityManager.getTransaction().commit();
}

public E findById(K id)
{
    entityManager.getTransaction().begin();
    entityManager.getTransaction().commit();
    return entityManager.find(entityClass, id);

}

}

Upvotes: 0

Views: 95

Answers (1)

Naresh Vavilala
Naresh Vavilala

Reputation: 608

You should replace userTypeSet.add(UserType.ADMIN); with userTypeSet2.add(UserType.ADMIN);

Upvotes: 1

Related Questions