I have an Application written in spring boot with 3 Tables T1, T2 and T3 on Postgres
t1 one2many mapping with t2 and t2 one2many with t3
How can I merge these tables into one? Do the model and repository still stay the same?
Model for T1
#Entity
#Table(name = "maintenance_type")
#EntityListeners(AuditingEntityListener.class)
#JsonIgnoreProperties(value = { "createdAt", "updatedAt" }, allowGetters = true)
public class MaintenanceType implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
#NotBlank
#Column(unique=true)
private String changeType;
#Column(nullable = false, updatable = false)
#Temporal(TemporalType.TIMESTAMP)
#CreatedDate
private Date createdAt;
#Column(nullable = false)
#Temporal(TemporalType.TIMESTAMP)
#LastModifiedDate
private Date updatedAt;
#OneToMany(mappedBy = "maintenanceType", cascade = CascadeType.ALL)
private Set<TierTwoQuestion> tierTwoQuestion;
public MaintenanceType() {
}
public MaintenanceType(Long id, String changeType) {
super();
this.id = id;
this.changeType = changeType;
}
public MaintenanceType(String changeType) {
super();
this.changeType = changeType;
}
public Set<TierTwoQuestion> getTierTwoQuestion() {
return tierTwoQuestion;
}
//
public void setTierTwoQuestion(Set<TierTwoQuestion> tierTwoQuestion) {
this.tierTwoQuestion = tierTwoQuestion;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getChangeType() {
return changeType;
}
public void setChangeType(String changeType) {
this.changeType = changeType;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
}
Model for T2
#Entity
#Table(name = "tier_two_question")
#EntityListeners(AuditingEntityListener.class)
#JsonIgnoreProperties(value = { "createdAt", "updatedAt" }, allowGetters = true)
public class TierTwoQuestion implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
#NotBlank
#Column(unique=true)
private String question;
#ManyToOne
#JoinColumn(name = "maintenanceId", nullable = false)
private MaintenanceType maintenanceType;
#OneToMany(mappedBy = "tierTwoQuestion", cascade = CascadeType.ALL)
private Set<TierThreeQuestion> tierThreeQuestion;
#Column(nullable = false, updatable = false)
#Temporal(TemporalType.TIMESTAMP)
#CreatedDate
private Date createdAt;
#Column(nullable = false)
#Temporal(TemporalType.TIMESTAMP)
#LastModifiedDate
private Date updatedAt;
public TierTwoQuestion() {
}
public TierTwoQuestion(Long id) {
super();
this.id = id;
this.question = question;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
// public MaintenanceType getMaintenanceType() {
// return maintenanceType;
// }
public void setMaintenanceType(MaintenanceType maintenanceType) {
this.maintenanceType = maintenanceType;
}
public Set<TierThreeQuestion> getTierThreeQuestion() {
return tierThreeQuestion;
}
public void setTierThreeQuestion(Set<TierThreeQuestion> tierThreeQuestion) {
this.tierThreeQuestion = tierThreeQuestion;
}
}
I tried adding recreating the model with all T1 T2 T3 in one table but not working as expected
Related
I have 2 tables one to many relationship between Employee and Department table, Employee table are having column Id as PK, Name and Sal whereas Department table having column Dept_ID,Dept_Name & Dept_Loc and primary key is (Dept_ID,Dept_Name) i.e composite key and Dept_ID is foreign key ref from Employee table's Id column. The issue is when I save record in parent table i.e Employee it get saved but if in case I get exception while inserting record for child table i.e Department table,,data is not getting rolled back for EMployee table. Please help I m struggling and I am attaching my code.
public class GlEmployee implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emp_seq")
#Column(name = "EMP_ID")
private long empId;
#Column(name = "EMP_CITY")
private String empCity;
#Column(name = "EMP_NAME")
private String empName;
#Column(name = "EMP_SALARY")
private BigDecimal empSalary;
// bi-directional many-to-one association to EmpDepartment
#OneToMany(mappedBy = "glEmployee",cascade = CascadeType.ALL)
private List<EmpDepartment> empDepartments = new ArrayList<>();
public GlEmployee() {
}
public long getEmpId() {
return this.empId;
}
public void setEmpId(long empId) {
this.empId = empId;
}
public String getEmpCity() {
return this.empCity;
}
public void setEmpCity(String empCity) {
this.empCity = empCity;
}
public String getEmpName() {
return this.empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public BigDecimal getEmpSalary() {
return this.empSalary;
}
public void setEmpSalary(BigDecimal empSalary) {
this.empSalary = empSalary;
}
public List<EmpDepartment> getEmpDepartments() {
return this.empDepartments;
}
public void setEmpDepartments(List<EmpDepartment> empDepartments) {
this.empDepartments = empDepartments;
}
public EmpDepartment addEmpDepartment(EmpDepartment empDepartment) {
getEmpDepartments().add(empDepartment);
empDepartment.setGlEmployee(this);
return empDepartment;
}
public EmpDepartment removeEmpDepartment(EmpDepartment empDepartment) {
getEmpDepartments().remove(empDepartment);
empDepartment.setGlEmployee(null);
return empDepartment;
}
}
#Entity
#Table(name = "EMP_DEPARTMENT")
public class EmpDepartment implements Serializable {
private static final long serialVersionUID = 1L;
#EmbeddedId
private EmpDepartmentPK id;
#Column(name = "DEP_LOC")
private String depLoc;
public EmpDepartment(EmpDepartment id, String dep) {
}
// bi-directional many-to-one association to GlEmployee
#ManyToOne(cascade = CascadeType.ALL)
#JoinColumn(name = "DEP_ID", insertable = false, updatable = false)
private GlEmployee glEmployee;
public EmpDepartment() {
}
public EmpDepartmentPK getId() {
return this.id;
}
public void setId(GlEmployee glEmployee, String deptName) {
EmpDepartmentPK empDepartment = new
EmpDepartmentPK(glEmployee.getEmpId(), deptName);
this.id = empDepartment;
}
public String getDepLoc() {
return this.depLoc;
}
public void setDepLoc(String depLoc) {
this.depLoc = depLoc;
}
public GlEmployee getGlEmployee() {
return this.glEmployee;
}
public void setGlEmployee(GlEmployee glEmployee) {
this.glEmployee = glEmployee;
}
}
#Embeddable
public class EmpDepartmentPK implements Serializable {
// default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
#Column(name = "DEP_ID")
private long depId;
#Column(name = "DEP_NAME")
private String depName;
public EmpDepartmentPK() {
}
public EmpDepartmentPK(long depId, String depName) {
super();
this.depId = depId;
this.depName = depName;
}
public long getDepId() {
return this.depId;
}
public void setDepId(long depId) {
this.depId = depId;
}
public String getDepName() {
return this.depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
#Service
public class EmployeeService {
#Autowired
private EmployeeRepository employeeRepository;
#Transactional
public void createEmp() {
GlEmployee employee = new GlEmployee();
employee.setEmpCity("Pune");
employee.setEmpName("Ankush");
employee.setEmpSalary(new BigDecimal(200));
employeeRepository.save(employee);
EmpDepartment department = new EmpDepartment();
department.setId(employee, "ME");
department.setDepLoc(null);
department.setGlEmployee(employee);
employee.addEmpDepartment(department);
employeeRepository.save(employee);
}
}
when there is a many to one associate between two object in hibernate(JPA) and we want insert a ID of parent to child table without new record in parent table how do I implement it?
#ManyToOne(targetEntity = RoleEntity.class,cascade = CascadeType.ALL,fetch = FetchType.LAZY)
#JoinColumn(name = "FK_ROLE_ID",referencedColumnName = "ID")
private RoleEntity role;
I write this:
UserEntity userEntity=new UserEntity();
userEntity.setUserName(username);
userEntity.setPassword(password);
userEntity.setCreatedDate(new Date().toString());
RoleEntity roleEntity=new RoleEntity();
roleEntity.setTitle("user");
userEntity.setRole(roleEntity);
but the last three line also insert a new record in user table.
This completely of roleEntity:
package Entity;
import javax.persistence.*;
import java.io.Serializable;
/**
* Created by Mohsen on 7/10/2018.
*/
#Entity(name = "role")
#Table(name = "ROLE")
public class RoleEntity implements Serializable {
#Id
#Column(name = "ID")
#SequenceGenerator(name = "SEQ_ROLE", sequenceName = "SEQ_ROLE", allocationSize = 1)
#GeneratedValue(generator = "SEQ_ROLE", strategy = GenerationType.SEQUENCE)
private int id;
#Basic
#Column(name = "Title")
private String title;
// #OneToMany(targetEntity = UserEntity.class,cascade = CascadeType.ALL,fetch = FetchType.LAZY)
// #JoinColumn(name = "FK_ROLE_ID",referencedColumnName = "ID")
// private Set<UserEntity> user;
public RoleEntity() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
This completely of userEntity:
package Entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Mohsen on 7/10/2018.
*/
#Entity(name = "user")
#Table(name = "USERR")
public class UserEntity implements Serializable {
#Id
#Column(name = "ID")
#SequenceGenerator(name = "SEQ_USER", allocationSize = 1, sequenceName = "SEQ_USER")
#GeneratedValue(generator = "SEQ_USER", strategy = GenerationType.SEQUENCE)
private int id;
#Basic
#Column(name = "UserName", columnDefinition = "VARCHAR2(20 CHAR)")
private String userName;
#Basic
#Column(name = "Password", columnDefinition = "VARCHAR2(255 CHAR)")
private String password;
#Basic
#Column(name = "CreatedDate")
private String createdDate;
#Basic
#Column(name = "EndedDate")
private String endedDate;
#OneToOne(targetEntity = PeopleEntity.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private PeopleEntity people;
#ManyToOne(targetEntity = RoleEntity.class,cascade = CascadeType.ALL,fetch = FetchType.LAZY)
#JoinColumn(name = "FK_ROLE_ID",referencedColumnName = "ID")
private RoleEntity role;
public RoleEntity getRole() {
return role;
}
public void setRole(RoleEntity role) {
this.role = role;
}
public UserEntity() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCreatedDate() {
return createdDate;
}
public void setCreatedDate(String createdDate) {
this.createdDate = createdDate;
}
public String getEndedDate() {
return endedDate;
}
public void setEndedDate(String endedDate) {
this.endedDate = endedDate;
}
public PeopleEntity getPeople() {
return people;
}
public void setPeople(PeopleEntity people) {
this.people = people;
}
}
I have found the solution
I set cascade = CascadeType.REMOVE in child object and it works
Here is my entity class
#Entity
#Table( name = "NEO_TEAM", schema = "METRICS" )
public class ETeam implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy=GenerationType.IDENTITY)
#Column(name="ID")
private int id;
#Column(name="NAME")
private String name;
#Column(name="DESCRIPTION")
private String description;
//bi-directional many-to-one association to ETeamQueue
#OneToMany(mappedBy="eteam" , fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<ETeamQueue> teamQueue;
public ETeam(int id,String name,String description){
this.id = id;
this.name = name;
this.description = description;
}
public ETeam(String name,String description){
this.name = name;
this.description = description;
}
public ETeam() {
}
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
public List<ETeamQueue> getTeamQueue() {
return this.teamQueue;
}
public void setTeamQueue(List<ETeamQueue> teamQueue) {
this.teamQueue = teamQueue;
}
public ETeamQueue addTeamQueue(ETeamQueue teamQueue) {
getTeamQueue().add(teamQueue);
teamQueue.setEteam(this);
return teamQueue;
}
public ETeamQueue removeTeamQueue(ETeamQueue teamQueue) {
getTeamQueue().remove(teamQueue);
teamQueue.setEteam(null);
return teamQueue;
}
}
And My REST call and JPQL query is
#Path("team")
#Produces(MediaType.APPLICATION_JSON)
public class TeamResource {
TeamService ts = new TeamService();
#GET
#Path("/{id}")
#Produces(MediaType.APPLICATION_JSON)
public List<ETeam> listTeam(#PathParam("id") int id){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("NeoMetrics");
EntityManager em = emf.createEntityManager();
Query query = em.createQuery("select e from ETeam e where e.id = :id ",ETeam.class);
query.setParameter("id", id);
List<ETeam> lis = (List<ETeam>) query.getResultList();
//List<ETeam> lis = ts.getTeam(id);
return lis;
}
i want to fetch only one record from the team table but it give me result like shown in picture , which show the result is looped thousand times , its very long output result i only put part of it , any help will be really appreciated
I have the following two entity classes: Country and Type
#Entity
#Table(name = "countries")
public class Country {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private int id ;
#Column(name = "iso_code")
private String isoCode;
public Country() {
}
public Country(String isoCode) {
this.isoCode = isoCode;
}
public Country(int id, String isoCode) {
this.id = id;
this.isoCode = isoCode;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getIsoCode() {
return isoCode;
}
public void setIsoCode(String isoCode) {
this.isoCode = isoCode;
}
#Override
public String toString() {
return "Country{" +
"id=" + id +
", isoCode='" + isoCode + '\'' +
'}';
}
}
#Entity
#Table(name = "types")
public class Type {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
#Column(name = "type")
private String type;
#ManyToOne
#JoinColumn(name = "country_id")
private Country country;
#ManyToOne
#JoinColumn(name = "group_id")
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Group getGroup() {
return group;
}
public void setGroup(int priority) {
this.group = group;
}
}
I am trying to retrieve groups using the following in the repository class:
QType qType = QType.type1;
QCountry qCountry = QCountry.country;
QGroup qGroup = QGroup.group;
QGroup qGroup1 = qType.group;
JPAQuery queryGroup = new JPAQuery(em);
QueryBase queryBaseGroups = queryGroup.from(qGroup).innerJoin(qGroup1, qGroup).innerJoin(qType.country, qCountry);
However, I get the error -
java.lang.IllegalArgumentException: Undeclared path 'type1'. Add this path as a source to the query to be able to reference it.
New to JPA. What am I doing wrong here?
So this was solved by adding qType to the from function in the query.
QueryBase queryBaseGroups = queryGroup.from(qGroup, qType).innerJoin(qGroup1, qGroup).innerJoin(qType.country, qCountry);
I'm using Spring data jpa and i am trying to do this :
#RequestMapping(value = "/setview/{id}", method = RequestMethod.GET)
public Iterable<Task> setView(#PathVariable Integer id) {
System.out.println("setViewTrue -------------------");
Iterable<Task> tasks = taskRepository.findByUserId(id);
for (Task t : tasks) {
t.setView(true);
taskRepository.save(t);
System.out.println("task****: "+ t.isView());
}
return tasks;
}
but i got this error:
[Ljava.lang.Object; cannot be cast to com.yess.erp.crm.domain.Task
i just want to loop an iterbale of tasks and change the value of a boolean(false) to true.
this is my Task.java:
#Entity
public class Task implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#SequenceGenerator(name = "pk_sequence", sequenceName = "task_id_seq", allocationSize = 1)
#GeneratedValue(strategy = GenerationType.AUTO, generator = "pk_sequence")
private Integer id;
#NotEmpty
private String title;
#Lob
private byte[] image;
private Date created_at;
private Date start_date;
private Date end_date;
private String description;
private boolean view;
#ManyToOne(fetch = FetchType.LAZY)
#JoinColumn(name = "user_id", nullable = false)
private User user;
public Task() {
}
public Task(String title, User user) {
super();
this.title = title;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public Date getStart_date() {
return start_date;
}
public void setStart_date(Date start_date) {
this.start_date = start_date;
}
public Date getEnd_date() {
return end_date;
}
public void setEnd_date(Date end_date) {
this.end_date = end_date;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Date getCreated_at() {
return created_at;
}
public void setCreated_at(Date created_at) {
this.created_at = created_at;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public boolean isView() {
return view;
}
public void setView(boolean view) {
this.view = view;
}
}
this is my TaskRepository.java:
public interface TaskRepository extends CrudRepository<Task, Integer> {
#Query("from Task as t inner join t.user as u where u.id = :id AND t.view = false")
Iterable<Task> findByUserId(#Param("id") Integer id);
}
this is my TaskController.java:
#RestController
#RequestMapping("/tasks")
public class TaskController {
#Autowired
private TaskRepository taskRepository;
.
.
.
#RequestMapping(value = "/setview/{id}", method = RequestMethod.GET)
public Iterable<Task> setView(#PathVariable Integer id) {
System.out.println("setViewTrue -------------------");
Iterable<Task> tasks = taskRepository.findByUserId(id);
for (Task t : tasks) {
t.setView(true);
taskRepository.save(t);
System.out.println("task****: "+ t.isView());
}
return tasks;
}
}
Your query isn't returning just a task, it is likely returning a task and user, in an Object[] array.
You might be able to alter your query to get a Task back. I'm thinking SELECT t FROM Task t...