I have 3 entities :
#Entity
#Table(name = "resultat")
public class Resultat {
#Id
#SequenceGenerator(name="s_resultat", sequenceName="pta.s_resultat", allocationSize=1)
#GeneratedValue(strategy=GenerationType.SEQUENCE, generator="s_resultat")
#Column(name = "result_code")
private Integer code;
#Column(name="result_intitule")
private String lib;
#ManyToOne
#JoinColumn(name = "acti_code")
private Activite activite;
...
}
#Entity
#Table(name = "activite")
public class Activite {
#Id()
#Column(name="acti_code")
private String code;
#Column(name="acti_design")
private String lib;
#ManyToOne
#JoinColumn(name = "action_code")
private Action action;
public Activite() {
super();
}
...
}
#Entity
#Table(name = "action")
public class Action {
#Id
#SequenceGenerator(name="s_action", sequenceName="pta.s_action", allocationSize=1)
#GeneratedValue(strategy=GenerationType.SEQUENCE, generator="s_action")
#Column(name = "action_code")
private Integer code;
#Column(name="action_design")
private String lib;
...
}
Now I want to display a master-detail JSP page for the two entities Activite and Resultat. I created DAOs returning list of Action, list of Activite, and list of Resultat. And called them in the controller in order to be passed to the JSP.
In my JSP I loop the list of Activite first , then I loop the list of Resultat :
<c:forEach items="${activites}" var="activite" varStatus="statusActivite">
<c:forEach items="${resultats}" var="resultat">
// here I want to test if resultat is the right foreign key for the actual activite
</c:forEach>
</c:forEach>
So how to write the test for the resultat variable to be the foreign key associated to the activite ?
Related
I have 2 entities and 1 embeddable object :
#Entity
class CourseDetails extends Course {
#Id
Integer id;
#ElementCollection
#CollectionTable(name = "course_section", joinColumns = #JoinColumn(name = "courseId"), foreignKey = #ForeignKey(name = "course_section_fk"))
private List<CourseSection> courseSection;
}
#Embeddable
public class CourseSection extends BaseBo {
#OneToMany
#JoinColumn(name="contentId")
private Set<CourseContent> courseContent = new HashSet<>();
}
#Entity
public class CourseContent {
private static final long serialVersionUID = 1856738483334146418L;
#Id
private Integer contentId;
private String contentSummary;
}
I want to store coursesection as an embedded object of course and course_section should contain reference of course_content. I tried the above structure but it gives error :
#ElementCollection cannot be used inside an #Embeddable that is also contained within an #ElementCollection
How to achieve this in spring boot-jpa ?
I had entities User, BlockUnit, Block and Unit as Follows.
User has ManyToMany relation with blockunit.
#Entity
public class User {
#ManyToMany
private Set<BlockUnit> blockUnits;
}
#Entity
public class BlockUnit {
#Id
private Long id;
#OneToOne(targetEntity = Block.class)
#JoinColumn(name = "block_id")
private Block block;
#OneToOne(targetEntity = Unit.class)
#JoinColumn(name = "unit_id")
private Unit unit;
#ManyToMany(fetch = FetchType.LAZY)
private Set<User> users = new HashSet<>();
}
BlockUnit has OneToOne relation with Block and Unit.
#Entity
public class Block {
#Id
private Long id;
}
#Entity
public class Unit {
#Id
private Long id;
}
How should I create the JPA criteria specification for above in order to select user's having Block ID and Unit ID?
Thank you very much in advance!
I have created two Entities namely Teacher and Detail, the code snippet is shown below
Teacher.java
#Entity
#Table(name = "teacher")
public class Teacher implements Serializable {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "id")
private long id;
#Column(name = "name")
private String name;
#Column(name = "age")
private int age;
#OneToOne(mappedBy = "teacher", cascade = CascadeType.ALL)
private Detail detail;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
//getter and setter
}
Detail.java
#Entity
#Table(name = "detail")
public class Detail implements Serializable {
#Id
#OneToOne(cascade = CascadeType.ALL)
#JoinColumn(name = "id")
private Teacher teacher;
#Column(name = "subjects")
private String subjects;
public Detail() {
}
public Detail(String subjects) {
this.subjects = subjects;
}
//getter and setter
}
I am trying to achieve one to one mapping with the shared primary key concept
but when i execute the controller, only Teacher table is updating with the value
try {
Teacher teacher=new Teacher("xyz",23);
Detail detail=new Detail("Java,c,c++");
teacher.setDetail(detail);
session.beginTransaction();
session.save(teacher);
session.getTransaction().commit();
model.addAttribute("added", "data inserted");
session.close();
}
After executing only Teacher table is updated with the specified values.Detail table is still showing empty
It does not work exactly like that. You still need the id field in your Detail, so add:
#Id
private long id;
to your Deatail class.
And - as comment suggests - replace the #Id annotation in field Teacher to #MapsId. This way the id of Teacher is mapped to the id of Detail BUT ONLY if you also set the teacher to the detail - you always need to set both sides of relationship - like:
teacher.setDetail(detail);
detail.setTeacher(teacher);
I got an issue when trying to load an object attribute in a jsp file.
The model contains a list of objects of type "Evaluation", for each element in the list, all the attributes are correctly loaded except the ones that it has to fetch from another table.
The .jsp file :
<div class="container">
<h1>Liste des Evaluations pour ${etudiant.username}</h1>
<table class="tbl">
<thead>
<th>Module</th>
<th>Note</th>
<th>Remarque</th>
</thead>
<tbody>
<c:forEach items="model.evaluations" var="ev">
<tr>
<td>${ev.examen.module.code}</td> --> Error occurs here
<td>${ev.note}</td>
<td>${ev.remarque}</td>
</tr>.
</c:forEach>
</tbody>
</table>
The Controller :
#RequestMapping(value="/{username}", method=RequestMethod.GET)
public String etudiantEvaluations(
#PathVariable String username, Model model) {
List<Evaluation> evaluations = evalDAO.findAllByEtudiant(username);
Etudiant etudiant = etDAO.findByUsername(username);
model.addAttribute("evaluations", evaluations);
model.addAttribute("etudiant", etudiant);
return "etudiants/listEvaluations";
}
The Evaluation entity :
#Data
#NoArgsConstructor
#EqualsAndHashCode
#Immutable #Entity(name="TEVALUATION")
public class Evaluation {
private enum evaldeliberation {
REUSSITE,
AJOURNEMENT,
REFUS,
ABANDON
}
#Id
#GeneratedValue(strategy=GenerationType.AUTO)
protected Long id;
#NotNull
#Min(0) #Max(100)
#Column(updatable = true)
private Double note;
#Column(name="deliberation")
private evaldeliberation delib;
#Column(name="remarque")
private String remarque;
#Column(name="module_code")
private String moduleCode;
private Long examenId;
private String etudiantUsername;
#ManyToOne(fetch=FetchType.EAGER)
#JoinColumn(name = "FKExamen",
insertable = false,
updatable = false)
protected Examen examen;
#ManyToOne
#JoinColumn(name = "FKEtudiant",
insertable = false,
updatable = false)
protected Etudiant etudiant;
#OneToMany(mappedBy="evaluation")
protected List<EvalComp> evalComps = new ArrayList<>();
public Evaluation(Double note, Examen examen, Etudiant etudiant) {
super();
this.examen = examen;
this.etudiant = etudiant;
examen.getEvaluations().add(this);
etudiant.getEvaluations().add(this);
}
}
Examen:
#Data
#EqualsAndHashCode
#NoArgsConstructor
#Entity(name="TEXAMEN")
public class Examen {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
#OneToMany(mappedBy = "examen")
private Set<Evaluation> evaluations = new HashSet<>();
#NotNull
#OneToOne(cascade=CascadeType.PERSIST)
#JoinColumn(name="FKmodule")
protected Module module;
public Examen(Module module) {
this.module = module;
}
}
The Query:
#Query("SELECT ev FROM TEVALUATION ev JOIN FETCH ev.examen ex JOIN FETCH ex.module m WHERE ev.etudiant=?1")
List<Evaluation> findAllByEtudiantId(String username);
The getters and setters are generated by Lombok(also tried without it).
Any idea how can I load the attributes ?
Thanks in advance.
I have a message class with a foreign key that should be the id of the author who wrote the message. As I understand it, the foreign key in the message class should look like the class below.
Setting the foreign key as the author object as below, seems absurd because instead of a short and human readable id like "5", I get a very long string in the database that isn't human readable.
I'm missing something, right?
message class:
public class Message {
...
private Author author; // this is the foreign key
...
#ManyToOne
#JoinColumn(name = "USERNAME")
public User getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
...
Creating the message object to be saved:
Author author = ...
message.setAuthor(author);
Assuming you are simply looking for a Many-to-One unidirectional relationship
#Entity
public class Message {
...
#ManyToOne
#JoinColumn(name="USERNAME")
private Author author;
#Entity
public class Author {
#Id
#GeneratedValue
#Column(name="USERNAME")
private Long USERNAME;
You do not post the annotations from the Author class. And it is highly probable that You are missing annotations on the Author class site. Nevertheless look below:
#Entity
#Table(name = "bill")
public class BillModel {
#Id
#GeneratedValue(strategy = GenerationType.SEQUENCE)
#Column(name = "bill_id")
private Integer billId;
#ManyToOne(fetch = FetchType.EAGER)
#JoinColumn(name = "fk_shop_id")
private Shop shop;
// getters and setters
}
and class Shop
#Entity
#Table(name = "shop")
public class Shop {
#Id
#GeneratedValue
#Column(name = "shop_id")
private Integer shopId;
#Column(name = "shop_name")
private String shopName;
#OneToMany(mappedBy = "shop", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<BillModel> billModels = new HashSet<BillModel>();
// getters and setters
}