How to save a copy of a entity - jpa

I use spring boot 3, I have this entity structure
#Data
#Entity
#Table
public class Repo {
#Id
#NotNull
private Long repoId;
#OneToMany(fetch = FetchType.LAZY, mappedBy = "repo", cascade = {CascadeType.ALL})
private List<Pub> pubs = new ArrayList<>(0);
...
}
#Data
#Entity
#Table
public class Pub {
#Id
#Column
#NotNull
protected Long pubId;
#ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
#JoinColumn(name = "type_id")
protected TypeDoc typeDoc;
#OneToMany(fetch = FetchType.LAZY, mappedBy = "pub", cascade = {CascadeType.ALL}, orphanRemoval = true)
protected List<Person> persons = new ArrayList<>(0)
#ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
#JoinTable(name = "pub_cat", schema = "", joinColumns = { #JoinColumn(name = "pub_id", nullable = true, updatable = false) }, inverseJoinColumns = { #JoinColumn(name = "cat_pub_id", nullable = true, updatable = false) })
private List<CatPub> catPub = new ArrayList<>(0);
}
A repo has a lit of pub, in reality they can have only 2.
So I feed a Pub object..... put it it the list of depot, and i need to create exactly the same and put it in the list of depot.
what is the most effective way to do it?

Related

How to delete entities in a chained one-to-many and many-to-many JPA relationship

I have a chain of entities as follows:
#Entity
#Table(name = "Patients")
public class Patient extends TimeStampedPersistable{
private static final long serialVersionUID = 1L;
#OneToMany(mappedBy="patient", cascade = CascadeType.ALL)
#PrivateOwned
private List<Insurance> insurances;
}
#Entity
#Table(name = "insurance")
public class Insurance extends PersistableEntity {
private static final long serialVersionUID = 1L;
#ManyToOne(optional=false)
#JoinColumn(name="patient_id", nullable=false)
private Patient patient;
#Column(name = "policy_number", unique = false, nullable = true)
private String policyNumber;
#ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
#JoinTable(name = "insurance_companycodes", joinColumns = {
#JoinColumn(name = "insurance_id", referencedColumnName = "id", nullable = false, updatable = false) }, inverseJoinColumns = {
#JoinColumn(name = "insuranceCompanyCode_id", referencedColumnName = "id", nullable = false, updatable = false) })
private Set<InsuranceCompanyCode> insuranceCompanyCodes = new HashSet<>();
}
#Entity
#Table(name = "insurance_company_codes")
public class InsuranceCompanyCode extends PersistableEntity {
private static final long serialVersionUID = 1L;
#Column(name = "identifier", unique = true, nullable = true)
private String identifier;
#ManyToMany(mappedBy = "insuranceCompanyCodes", fetch = FetchType.LAZY)
private Set<Insurance> insurances = new HashSet<>();
}
I need to remove insurance items from the Patient object. I am using the following code:
for (Iterator<Insurance> iterator = patient.getInsurances().iterator(); iterator.hasNext();) {
iterator.next();
iterator.remove();
}
This seems to work for child entities that don't have child entities, however in this situation the Insurance entity has child entities and is not actually removed (no exceptions are displayed). Note, I am using the EclipseLink specific annotation #PrivateOwned which I expected would have forced the removal of the Insurance entities.
Any guidance, suggestions appreciated!

JPARepository - sometimes create duplicate records

I have the following entity class.
#Data
#EqualsAndHashCode(callSuper=false)
#ToString(callSuper=true)
#Entity
#Table(name = "storeitem")
public class StoreItem extends SellableStoreItem {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private UUID id;
#EqualsAndHashCode.Exclude
#ToString.Exclude
#ManyToOne
#JoinColumn(name = "store_id")
private Store store;
#EqualsAndHashCode.Exclude
#ToString.Exclude
#ManyToOne
#JoinColumn(name = "storeitemcategory_id", nullable = true)
private StoreItemCategory storeItemCategory;
#EqualsAndHashCode.Exclude
#OneToMany(fetch = FetchType.EAGER, mappedBy = "storeItem")
private List<StoreItemTranslation> storeItemTranslationList = new ArrayList<>();
#EqualsAndHashCode.Exclude
#OneToMany(mappedBy = "storeItem",
cascade = CascadeType.ALL,
orphanRemoval = true)
private List<StoreItemOptionCollectionSelection> storeItemOptionCollectionSelections = new ArrayList<>();
#EqualsAndHashCode.Exclude
#Column(name = "uid")
private UUID uid = UUID.randomUUID();
#EqualsAndHashCode.Exclude
#CreationTimestamp
#Column(name = "createddate", nullable = false)
private LocalDateTime createdDate;
#EqualsAndHashCode.Exclude
#Column(name = "iscurrent", nullable = false)
private boolean isCurrent = true;
And in my service layer, I do the following.
private StoreItemResponse setStoreItemCreate(StoreItemDTO storeItemDTO, Store store, StoreItemCategory storeItemCategory) {
StoreItem storeItem = new StoreItem(storeItemDTO, store, storeItemCategory);
if(storeItemDTO.getUid() != null){
storeItem.setUid(storeItemDTO.getUid());
}
storeItem = storeItemRepository.save(storeItem);
// Create Translations for store Item
for (TranslationDTO translationDTO : storeItemDTO.getTranslationDTOs()) {
StoreItemTranslation translation = new StoreItemTranslation(translationDTO, storeItem);
storeItemTranslationRepository.save(translation);
}
return new StoreItemResponse(storeItem.getId(), DtoResponseStatus.OK);
}
However, when testing the code, I notice that there are times (not often but some cases) I see duplicate records (with different id) are being saved to database. And the duplicates are saved 2ms apart so I suspect storeItem = storeItemRepository.save(storeItem); created the duplicate records.
Why would this happen?

Hibernate error: mappedBy reference an unknown target entity property

I am having an issue in setting up a many to many relationship in my entities. And I don't understand why
failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: cardgame.bean.User.card in cardgame.bean.Card.users
My Entities:
#MappedSuperclass
#Data
public class BaseEntity implements Serializable {
#Id
#Column(name = "id", nullable = false, unique = true)
private String id;
public BaseEntity() {
this.id = UUID.randomUUID().toString();
}
}
My user emtity:
#Data
#Entity
#Table(name = "users")
public class User extends BaseEntity {
#Column(name = "username", nullable = false, unique = true)
private String username;
#Column(name = "uuid", nullable = false)
private String uuid;
#Column(name = "email", nullable = false, unique = true)
private String email;
#OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Card> cards;
#Column(name = "isActive", nullable = false)
private boolean isActive;
}
My card entity:
#Data
#Entity
#Table(name = "cards")
public class Card extends BaseEntity {
#OneToMany(mappedBy = "card")
private List<User> users;
#Column(name = "strength", nullable = false)
private int strength;
#Column(name = "isActive", nullable = false)
private boolean isActive;
}
The users and cards tables have a many-to-many relationship via user_card table:
#Data
#Entity
#Table(name = "user_card")
public class UserCard implements Serializable {
#Id
#ManyToOne
#JoinColumn(name = "user_id", nullable = false)
private User user;
#Id
#ManyToOne
#JoinColumn(name = "card_id", nullable = false)
private Card card;
#Column(name = "cardCount", nullable = false)
private int cardCount;
}
What am i doing incorrect. Please help me

#ManyToMany relation with composite key and extra column, nested column in intermediate table

this is my current situation :
I have a diagram like this. In the intermediate tables I have 1 more extra column. The problem here is in the table "Period_Area_CC", the column "Area_CompNo" is referenced by 2 columns ("CompNo" from table "CC" and "Area_CompNo" from tablle "Period_Area")
And here is my mapping
public class Area extends BaseEntity {
#EmbeddedId
private AreaId id;
#OneToMany(mappedBy = "area", cascade = CascadeType.ALL, orphanRemoval = true)
private List<AreaPeriod> areaPeriods;
}
public class AreaPeriod implements Serializable {
#Id
#Column(name = "periodAssignmentID")
private Long periodID;
#Id
#Column(name = "areaID")
private Long areaID;
#Id
#Column(name = "companyNo")
private Long companyNo;
private Long parentId;
#Column(name = "hierarchyPath")
private String hierarchyPath;
#ManyToOne
#JoinColumns({#JoinColumn(name = "areaID", referencedColumnName = "areaID", updatable = false, insertable = false),
#JoinColumn(name = "companyNo", referencedColumnName = "companyNo", updatable = false, insertable = false)})
private Area area;
#ManyToOne
#JoinColumns({#JoinColumn(name = "periodAssignmentID", referencedColumnName = "periodAssignmentID", updatable = false, insertable = false)})
private VirtualAreaPeriodDefinition period;
#OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private Set<AreaPeriod> children;
#ManyToOne
#JoinColumns({#JoinColumn(name = "periodAssignmentID", referencedColumnName = "periodAssignmentID", insertable = false, updatable = false),
#JoinColumn(name = "parentId", referencedColumnName = "areaID", insertable = false, updatable = false),
#JoinColumn(name = "companyNo", referencedColumnName = "companyNo", insertable = false, updatable = false)})
private AreaPeriod parent;
#OneToMany(mappedBy = "areaPeriod", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CostCenterAreaPeriod> costCenterAreaPeriods;
}
public class CostCenterAreaPeriod implements Serializable {
#Id
#Column(name = "companyNo")
private Long companyNo;
#Id
#Column(name = "periodAssignmentID")
private Long periodId;
#Id
#Column(name = "areaID")
private Long areaId;
#Id
#Column(name = "CostCenterEnum")
private Long costCenterEnum;
private String hierarchyPath;
#ManyToOne
#JoinColumns({#JoinColumn(name = "areaID", referencedColumnName = "areaID", updatable = false, insertable = false),
#JoinColumn(name = "companyNo", referencedColumnName = "companyNo", updatable = false, insertable = false),
#JoinColumn(name = "periodAssignmentID", referencedColumnName = "periodAssignmentID", updatable = false, insertable = false)})
private AreaPeriod areaPeriod;
#ManyToOne
#JoinColumns({#JoinColumn(name = "CompanyNo", referencedColumnName = "companyNo", updatable = false, insertable = false),
#JoinColumn(name = "CostCenterEnum", referencedColumnName = "CostCenterEnum", updatable = false, insertable = false)})
private CostCenter costCenter;
}
public class CostCenter extends BaseEntity {
private static final long serialVersionUID = -2290076530189347245L;
#EmbeddedId
private CXCostCenterPK id;
#OneToMany(mappedBy = "costCenter", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CostCenterAreaPeriod> costCenterAreaPeriods;
}
Because I have marked the relation with insertable and updateable false so I have to insert manually.
So is there any better solution, so I just need to map the relation on the entity, then JPA will handle the insert/update/delete funtion?
Updated :
public class CXCostCenterPK implements Serializable {
private static final long serialVersionUID = 658550094878047277L;
#Column(name = "CompanyNo")
private Long companyNo;
#Column(name = "CostCenterEnum")
private Long costCenterEnum;
}
public class AreaId implements Serializable {
#Column(name = "companyNo", length = 5, nullable = false)
private Long companyNo;
#Column(name = "areaID", length = 11, nullable = false)
private Long areaEnum;
}

JPA filter entity nested list of objects

I'm Using JPA 2.1. I have 3 entities: Dr01 , Dr02 and Dr03 with the following structure:
public class Dr01 implements Serializable {
#OneToMany(cascade = CascadeType.ALL, mappedBy = "dr01")
private List<Dr02> dr02List;
}
public class Dr02 implements Serializable {
#OneToMany(cascade = CascadeType.ALL, mappedBy = "dr02")
private List<Dr03> dr03List;
#JoinColumn(name = "DR2CLM", referencedColumnName = "DR1CLM", insertable = false, updatable = false)
#ManyToOne(optional = false)
private Dr01 dr01;
}
public class Dr03 implements Serializable {
#JoinColumns({
#JoinColumn(name = "DR3CLM", referencedColumnName = "DR2CLM", insertable = false, updatable = false),
#JoinColumn(name = "DR3PTFN", referencedColumnName = "DR2PTFN", insertable = false, updatable = false)})
#ManyToOne(optional = false)
private Dr02 dr02;
private elementOBJ element;
}
public class elementOBJ implements Serializable {
#Column(name = "XXX")
private int id;
#Column(name = "YYY")
private int status;
}
I want to select from Dr01 and get only the Dr03 objects that have element objects which contains a value of 1 inside the status field.
How do I retrieve dr03List filtered by it's status value? (filtered not after the select).
Thank's In Advance.
Options that may be of assistance:
Create a DB view based on status of DR03 table and map your
entity to that.
Use JPA Inheritance using status as a
DiscriminatorColumn.
If using Hibernate use the non-JPA #Where
annotation to filter the collection