IdentifierGenerationException: attempted to assign id from null one-to-one property + #MapsId + OneToOne bidirectional - jpa-2.0

I'm getting error
org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property.
The code snippets:
User.java
#Entity
#Table(schema = "public", name = "user_01")
public class User {
#Id
#GeneratedValue(generator = "UUID")
#GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
#Column(name = "id", updatable = false, nullable = false)
private UUID id;
#OneToOne(cascade = CascadeType.ALL)
#PrimaryKeyJoinColumn
#JoinColumn(name = "user")
private UserInformation userInformation;
UserInformation .java
#Entity
#Table(schema = "public", name = "user_information_06")
public class UserInformation {
#Id
#Column(name = "id")
private UUID id;
#MapsId
#OneToOne(mappedBy = "userInformation")
private User user;
UserInformationService.java
// CREATE
public UserInformationBean createUserInformation(UserInformationBean userInformationBean) {
if(userInformationBean == null || userInformationBean.getUserId() == null)
return null;
User user = userRepository.findById(userInformationBean.getUserId()).orElse(null);
if(user == null)
return null;
UserInformation userInformation = user.getUserInformation();
if(userInformation != null) {
System.err.println("User Information exists !! " + userInformation.getId());
return null;
}
userInformation = new UserInformation();
userInformation.setFirstname(userInformationBean.getFirstname());
userInformation.setLastname(userInformationBean.getLastname());
userInformation.setGender(userInformationBean.getGender());
userInformation.setDateOfBirth(userInformationBean.getDateOfBirth());
userInformation.setProfession(userInformationBean.getProfession());
userInformation.setUpdatedOn(Timestamp.valueOf(LocalDateTime.now()));
user.setUserInformation(userInformation);
userInformation.setUser(user);
user = userRepository.save(user);
return userInformation.toBean();
}

After changing the below:
user = userRepository.save(user);
To:
userInformation = userInformationRepository.save(userInformation);
It works fine! Still want to know the reason and why it can't be persisted via User entity.

Related

How to persist a property of type List<List<Object>> in JPA?

What is the smartest way to get an entity with a field of type List<List> persisted?
#Entity
#Table(name = "Final_Feign_Client_Result")
public class FinalFCResultEntity {
#Id
#Column(name = "id")
#GeneratedValue(strategy = IDENTITY)
private Integer id;
#ElementCollection(targetClass = Object.class)
#CollectionTable(name = "Final_Feign_Client_Result_Columns")
#OnDelete(action = OnDeleteAction.CASCADE)
#JoinColumn(name = "final_feign_client_result_entity_id", nullable = false)
private Set<Object> values;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Set<Object> getValues() {
return values;
}
public void setValues(Set<Object> values) {
this.values = values;
}
}
I have no problem with columns, but if I try to insert values I get this exception:
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: final_feign_client_result_columns, for columns: [org.hibernate.mapping.Column(values)]
How I can solve this problem?
Hi guidop21 please add
#ElementCollection(targetClass = Object.class)
#CollectionTable(name = "Final_Feign_Client_Result_Columns")
#OnDelete(action = OnDeleteAction.CASCADE)
#JoinColumn(name = "final_feign_client_result_entity_id", nullable = false)
#OneToMany
private List<List<<Object>> values;

Spring hibernate criteria nested object

I have problem with correct query for my data.
#Id
#GeneratedValue
private Integer id;
#Size(min = 1, message = "")
#Column(unique = true)
#UniqueUserName(message = "")
private String name;
#Size(min = 1, message = "")
#Email
private String email;
#Size(min = 5, message = "")
private String password;
private boolean enabled;
#ManyToMany
#JoinTable
private List<Role> roles;
#OneToOne
#JoinColumn
private PersonalData personalData;
#OneToMany(cascade = CascadeType.REMOVE)
#JoinColumn(name = "OWNED_USER_ID")
private List<User> userList;
That's my class User. And i want to get list of all owned users by user.
here is my code:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.setProjection(Property.forName("userList.id"));
Session session = entityManager.unwrap(Session.class);
Criteria criteria = session.createCriteria(OfferStorage.class);
criteria.add(Subqueries.propertyIn("user.id", detachedCriteria));
criteria.list();
And it's return me following error
could not resolve property: userList.id
It's same if u use userList.user.id. Any ideas?
Well that was fast.
If some else would have problem with it there is answer
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.createAlias("userList", "userList");
detachedCriteria.add(Restrictions.eq("id", userId ));
detachedCriteria.setProjection(Property.forName("userList.id"));
Session session = entityManager.unwrap(Session.class);
Criteria criteria = session.createCriteria(OfferStorage.class);
criteria.add(Subqueries.propertyIn("user.id", detachedCriteria));
criteria.list();

Hibernate criteria cannot fetch rows could not resolve property

Hi i have these 2 basic entity mapping for postgresql db, and i have wrote criteria for
fetching all activated user which have same key it is showing this error
org.hibernate.QueryException: could not resolve property: key.id of: com.sar.dfsapp.modal.ActivatedUser
#Entity
#Table(name = "activated_user")
public class ActivatedUser implements Serializable {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "id", nullable = false, length = 11)
private long id;
#ManyToOne
#JoinColumn(name = "key_id", nullable = false)
private Key key;
}
#Entity
#Table(name = "key")
public class Key implements Serializable {
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "id", nullable = false, length = 11)
private long id;
#Column(name = "key_code", nullable = false)
private String keyCode;
}
Below is my criteria i have tried.
Criteria c = getSession().createCriteria(ActivatedUser.class);
c.add(Restrictions.eq("key.id", id));
List<ActivatedUser> result = c.list();
try this :
Criteria c = getSession().createCriteria(ActivatedUser.class);
Criteria keyCriteria = criteria.createCriteria("key", CriteriaSpecification.INNER_JOIN);
keyCriteria.add(Restrictions.eq("id", id));
List<ActivatedUser> result = c.list();
it there the same error ?

Web Services Deep XML Error

The error occurs when I try to get a list from two tables
i.e University and Usermaster, where Usermaster is the parent Table.
I am trying to get data from both tables based on University .
University Entity
package entity;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* #author 3gth
*/
#Entity
#Table(name = "university")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "University.findAll", query = "SELECT u FROM University u"),
#NamedQuery(name = "University.findByUniversityUname", query = "SELECT u FROM University u WHERE u.universityUname = :universityUname"),
#NamedQuery(name = "University.findByUniversityRegNo", query = "SELECT u FROM University u WHERE u.universityRegNo = :universityRegNo"),
#NamedQuery(name = "University.findByUniversityWebsite", query = "SELECT u FROM University u WHERE u.universityWebsite = :universityWebsite")})
public class University implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 50)
#Column(name = "universityUname")
private String universityUname;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 10)
#Column(name = "universityRegNo")
private String universityRegNo;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 100)
#Column(name = "universityWebsite")
private String universityWebsite;
#Basic(optional = false)
#NotNull
#Lob
#Size(min = 1, max = 65535)
#Column(name = "universityDesc")
private String universityDesc;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "universityUname")
private List<College> collegeList;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "universityUname")
private List<Student> studentList;
#JoinColumn(name = "universityUname", referencedColumnName = "username", insertable = false, updatable = false)
#OneToOne(optional = false)
private Usermaster usermaster;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "universityUname")
private List<Faculty> facultyList;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "universityUname")
private List<Course> courseList;
public University() {
}
public University(String universityUname) {
this.universityUname = universityUname;
}
public University(String universityUname, String universityRegNo, String universityWebsite, String universityDesc) {
this.universityUname = universityUname;
this.universityRegNo = universityRegNo;
this.universityWebsite = universityWebsite;
this.universityDesc = universityDesc;
}
public String getUniversityUname() {
return universityUname;
}
public void setUniversityUname(String universityUname) {
this.universityUname = universityUname;
}
public String getUniversityRegNo() {
return universityRegNo;
}
public void setUniversityRegNo(String universityRegNo) {
this.universityRegNo = universityRegNo;
}
public String getUniversityWebsite() {
return universityWebsite;
}
public void setUniversityWebsite(String universityWebsite) {
this.universityWebsite = universityWebsite;
}
public String getUniversityDesc() {
return universityDesc;
}
public void setUniversityDesc(String universityDesc) {
this.universityDesc = universityDesc;
}
#XmlTransient
public List<College> getCollegeList() {
return collegeList;
}
public void setCollegeList(List<College> collegeList) {
this.collegeList = collegeList;
}
#XmlTransient
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
public Usermaster getUsermaster() {
return usermaster;
}
public void setUsermaster(Usermaster usermaster) {
this.usermaster = usermaster;
}
#XmlTransient
public List<Faculty> getFacultyList() {
return facultyList;
}
public void setFacultyList(List<Faculty> facultyList) {
this.facultyList = facultyList;
}
#XmlTransient
public List<Course> getCourseList() {
return courseList;
}
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
#Override
public int hashCode() {
int hash = 0;
hash += (universityUname != null ? universityUname.hashCode() : 0);
return hash;
}
#Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof University)) {
return false;
}
University other = (University) object;
if ((this.universityUname == null && other.universityUname != null) || (this.universityUname != null && !this.universityUname.equals(other.universityUname))) {
return false;
}
return true;
}
#Override
public String toString() {
return "entity.University[ universityUname=" + universityUname + " ]";
}
}
Usermaster Entity
package entity;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* #author 3gth
*/
#Entity
#Table(name = "usermaster")
#XmlRootElement
#NamedQueries({
#NamedQuery(name = "Usermaster.findAll", query = "SELECT u FROM Usermaster u"),
#NamedQuery(name = "Usermaster.findByUsername", query = "SELECT u FROM Usermaster u WHERE u.username = :username"),
#NamedQuery(name = "Usermaster.findByPassword", query = "SELECT u FROM Usermaster u WHERE u.password = :password"),
#NamedQuery(name = "Usermaster.findByEmail", query = "SELECT u FROM Usermaster u WHERE u.email = :email"),
#NamedQuery(name = "Usermaster.findByProfilePic", query = "SELECT u FROM Usermaster u WHERE u.profilePic = :profilePic"),
#NamedQuery(name = "Usermaster.findByName", query = "SELECT u FROM Usermaster u WHERE u.name = :name"),
#NamedQuery(name = "Usermaster.findByContactNo", query = "SELECT u FROM Usermaster u WHERE u.contactNo = :contactNo"),
#NamedQuery(name = "Usermaster.findByStatus", query = "SELECT u FROM Usermaster u WHERE u.status = :status")})
public class Usermaster implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 50)
#Column(name = "username")
private String username;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 32)
#Column(name = "password")
private String password;
#Basic(optional = false)
#NotNull
#Lob
#Size(min = 1, max = 65535)
#Column(name = "address")
private String address;
#Basic(optional = false)
#NotNull
#Lob
#Size(min = 1, max = 65535)
#Column(name = "mapLocation")
private String mapLocation;
// #Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 32)
#Column(name = "email")
private String email;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 100)
#Column(name = "profilePic")
private String profilePic;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 50)
#Column(name = "name")
private String name;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 10)
#Column(name = "contactNo")
private String contactNo;
#Basic(optional = false)
#NotNull
#Column(name = "status")
private boolean status;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "usermaster")
private College college;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "usermaster")
private Student student;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "usermaster")
private University university;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "username")
private List<Detailnotification> detailnotificationList;
#OneToOne(cascade = CascadeType.ALL, mappedBy = "usermaster")
private Faculty faculty;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "usermaster")
private List<Groupmaster> groupmasterList;
public Usermaster() {
}
public Usermaster(String username) {
this.username = username;
}
public Usermaster(String username, String password, String address, String mapLocation, String email, String profilePic, String name, String contactNo, boolean status) {
this.username = username;
this.password = password;
this.address = address;
this.mapLocation = mapLocation;
this.email = email;
this.profilePic = profilePic;
this.name = name;
this.contactNo = contactNo;
this.status = status;
}
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 getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getMapLocation() {
return mapLocation;
}
public void setMapLocation(String mapLocation) {
this.mapLocation = mapLocation;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getProfilePic() {
return profilePic;
}
public void setProfilePic(String profilePic) {
this.profilePic = profilePic;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContactNo() {
return contactNo;
}
public void setContactNo(String contactNo) {
this.contactNo = contactNo;
}
public boolean getStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public College getCollege() {
return college;
}
public void setCollege(College college) {
this.college = college;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public University getUniversity() {
return university;
}
public void setUniversity(University university) {
this.university = university;
}
#XmlTransient
public List<Detailnotification> getDetailnotificationList() {
return detailnotificationList;
}
public void setDetailnotificationList(List<Detailnotification> detailnotificationList) {
this.detailnotificationList = detailnotificationList;
}
public Faculty getFaculty() {
return faculty;
}
public void setFaculty(Faculty faculty) {
this.faculty = faculty;
}
#XmlTransient
public List<Groupmaster> getGroupmasterList() {
return groupmasterList;
}
public void setGroupmasterList(List<Groupmaster> groupmasterList) {
this.groupmasterList = groupmasterList;
}
#Override
public int hashCode() {
int hash = 0;
hash += (username != null ? username.hashCode() : 0);
return hash;
}
#Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Usermaster)) {
return false;
}
Usermaster other = (Usermaster) object;
if ((this.username == null && other.username != null) || (this.username != null && !this.username.equals(other.username))) {
return false;
}
return true;
}
#Override
public String toString() {
return "entity.Usermaster[ username=" + username + " ]";
}
}
The medthod in Statless Bean
#Override
public List<University> getAllUniversitys() {
try {
return em.createNamedQuery("University.findAll").getResultList();
} catch (Exception e) {
System.out.println("Error :- " + e.getMessage());
}
return null;
}
The Managed Bean code where it is called through Web Service
public List<University> getAllUniversity() {
try {
adminService.AdminBl adminPort = service.getAdminBlPort();
return adminPort.getAllUniversitys();
//return oAdminBlLocal.getAllUniversitys();
} catch (Exception e) {
System.out.println("Error :- " + e.getMessage());
}
return null;
}
And this is the error:
Severe: Error occured
javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.University[ universityUname=abc ] -> entity.Usermaster[ username=abc ] -> entity.University[ universityUname=abc ]]
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:424)
at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:192)
at com.sun.xml.ws.api.message.saaj.SAAJFactory.readAsSOAPMessage(SAAJFactory.java:285)
at com.sun.xml.ws.api.message.saaj.SAAJFactory.read(SAAJFactory.java:163)
at com.sun.xml.ws.message.AbstractMessageImpl.readAsSOAPMessage(AbstractMessageImpl.java:249)
at org.glassfish.webservices.SOAPMessageContextImpl.getMessage(SOAPMessageContextImpl.java:90)
at org.glassfish.webservices.monitoring.MessageTraceImpl.setMessageContext(MessageTraceImpl.java:121)
at org.glassfish.webservices.monitoring.JAXWSEndpointImpl.processResponse(JAXWSEndpointImpl.java:113)
at org.glassfish.webservices.MonitoringPipe.process(MonitoringPipe.java:150)
at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1136)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)
at com.sun.xml.ws.api.pipe.helper.AbstractTubeImpl.process(AbstractTubeImpl.java:136)
at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:209)
at com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:141)
at com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119)
at com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:1136)
at com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:1050)
at com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:1019)
at com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:877)
at com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:419)
at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:868)
at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:422)
at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:169)
at org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:110)
at org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:80)
at org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:210)
at org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:153)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.glassfish.grizzly.servlet.ServletHandler.doServletService(ServletHandler.java:223)
at org.glassfish.grizzly.servlet.ServletHandler.service(ServletHandler.java:174)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.University[ universityUname=abc ] -> entity.Usermaster[ username=abc ] -> entity.University[ universityUname=abc ]]
at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:276)
at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:94)
at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:111)
at com.sun.xml.ws.db.glassfish.BridgeWrapper.marshal(BridgeWrapper.java:192)
at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:417)
... 51 more
Thanks in advance.
The error is really self-explanatory: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.University[ universityUname=abc ] -> entity.Usermaster[ username=abc ] -> entity.University[ universityUname=abc ]]
Just add #XmlTransient to Usermaster.getUniversity() to break the cycle.

Do I need to Set Foreign key value in JPA?

I have two table:
CREATE TABLE [LeTYPE](
[LeNAME] [varchar](100) NOT NULL,
[Le_DESC] [varchar](500) NULL,
[LeFOR] [varchar](50) NOT NULL,
CONSTRAINT [PK_LeTYPE] PRIMARY KEY CLUSTERED
(
[LeNAME] ASC
)
)
CREATE TABLE [Le](
[SN] [int] IDENTITY(1,1) NOT NULL,
[LeNAME_FK] [varchar](100) NOT NULL,
[Le_SN] [int] NULL,
[LOWERRANGE] [float] NOT NULL,
[UPPERRANGE] [float] NOT NULL,
[Le_DESC] [varchar](500) NULL,
[COLOR] [varchar](45) NULL,
CONSTRAINT [Le_pk] PRIMARY KEY CLUSTERED
(
[SN] ASC
))
GO
ALTER TABLE [Le] WITH CHECK ADD CONSTRAINT [FK_Le_LeTYPE] FOREIGN KEY([LeNAME_FK])
REFERENCES [LeTYPE] ([LeNAME])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [Le] CHECK CONSTRAINT [FK_Le_LeTYPE]
GO
One tuple in LETYPE will have many LE.
JPA Entity generated by netbeans:
public class Letype implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 100)
#Column(nullable = false, length = 100)
private String Lename;
#Size(max = 500)
#Column(name = "Le_DESC", length = 500)
private String LeDesc;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 50)
#Column(nullable = false, length = 50)
private String Lefor;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "LenameFk", fetch = FetchType.LAZY)
private List<Le> LeList;
}
public class Le implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#NotNull
#Column(nullable = false)
private Integer sn;
#Column(name = "Le_SN")
private Integer LeSn;
#Basic(optional = false)
#NotNull
#Column(nullable = false)
private double lowerrange;
#Basic(optional = false)
#NotNull
#Column(nullable = false)
private double upperrange;
#Size(max = 500)
#Column(name = "Le_DESC", length = 500)
private String LeDesc;
#Size(max = 45)
#Column(length = 45)
private String color;
#JoinColumn(name = "LeNAME_FK", referencedColumnName = "LeNAME", nullable = false)
#ManyToOne(optional = false, fetch = FetchType.LAZY)
private Letype LenameFk;
}
Now, What I wanted was if I add a LETYPE from JSF view I would like to add multiple LE also at the same time.
LETYPE
-LE1
-LE2
-LE3
Do I need to set LenameFk manually in Le entity since I am getting
*Cannot insert the value NULL into column 'LENAME_FK'*? Why won't it automatically take it from Le enityt?
Note this snippet of code:
public class Le implements Serializable {
...
#ManyToOne(optional = false, fetch = FetchType.LAZY)
private Letype LenameFk;
...
}
optional = false means any instance of this entity must participate the relation, so, the foreign key field can not be null.
Your right, You need to set LenameFk manually in Le entity.
In General , for Bi-directional one-to-many two way relation , Accessor method should like below and assume entities are Customer and Order and one-to-many relation b/w them.
Customer.java
public Collection<Order> getOrders() {
return Collections.unmodifiableCollection(orders);
}
public void addToOrders(Order value) {
if (!orders.contains(value)) {
orders.add(value);
value.setCustomer(this);
}
}
public void removeFromOrders(Order value) {
if (orders.remove(value)) {
value.setCustomer(null);
}
}
Order.java
public void setCustomer(Customer value) {
if (this.customer != value) {
if (this.customer != null) {
this.customer.removeFromOrders(this);
}
this.customer = value;
if (value != null) {
value.addToOrders(this);
}
}
}
public Customer getCustomer() {
return customer;
}