Why i get must use a #JoinColumn instead of #Column - java

i am tryning to join two entities where typDossAmo can have a list of DossMedic
but i get the following error:
Entity class [class ma.cnss.wstest.TypDossAmo] must use a #JoinColumn instead of #Column to map its relationship attribute [drugs].
public class TypDossAmo implements Serializable {
private static final long serialVersionUID = 1L;
#Column(name = "ID")
private BigInteger id;
#Id
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 9)
#Column(name = "NUM_DOSS")
private String numDoss;
#Column(name = "p_tab_medic")
#OneToMany(mappedBy="doss")
private List<DossMedic> drugs;........
public class DossMedic implements Serializable {
private static final long serialVersionUID = 1L;
#EmbeddedId
protected DossMedicPK dossMedicPK;
#Column(name = "ID")
private BigInteger id;
#Column(name = "NOMBRE")
private BigInteger nombre;
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="NUM_DOSS")
private TypDossAmo doss;

The idea of the annotation #Column is for common columns without any relationship with other tables, when you use #JoinColumn is to say to the ORM that two tables have a relationship and the way to join them is with this column.
In this case the solution is change the annotation #Column by #JoinColumn in TypDossAmo
public class TypDossAmo {
#JoinColumn(name = "p_tab_medic")
#OneToMany(mappedBy="doss")
private List<DossMedic> drugs;
}

Related

How to maintain foreign key relationship in hibernate

I have two classes and I want to have a one to many relation between them, for e.g.:
Home(id<int>, rooms<string>)
Vehicle(id<int>, home_id<int>, name<string>)
I need to have a relation between Home and Vehicle class using Home.id and vehicle.home_id.
Please suggest any example which I can use here for CURD operation to implement REST service.
I need to have a relation between Home and Vehicle class using Home.id
and vehicle.home_id.
Your entities should look like this :
Vehicle Entity
#Entity
#Table(name = "vehicle", catalog = "bd_name", schema = "schema_name")
#XmlRootElement
public class Vehicle implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Column(name = "name")
private String name;
#JoinColumn(name = "home_id", referencedColumnName = "id")
#ManyToOne
private Home homeId;
//constructor getter & setters
}
Home Entity
#Entity
#Table(name = "home", catalog = "bd_name", schema = "schema_name")
#XmlRootElement
public class Home implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "id")
private Integer id;
#Column(name = "room")
private Character room;
#OneToMany(mappedBy = "homeId")
private List<Vehicle> vehicleList;
//constructor getter & setters
}

Hibernate Self reference

I'm trying to map with Hibernate an entity Product with self reference to other products.
The JSON sent to create a project is like this:
{"name":"chair", "description":"red chair",
"parent": {"name":"table","description":"red table"}
}
When I receive this json, I need to persist on DB the child product and set PARENT_PRODUCT_ID with the productId from parent attribute.
Some help, please?
public class Product implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Column(name = "ID")
#GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer productId;
#Column(name = "NAME")
private String name;
#Column(name = "DESCRIPTION")
private String description;
#OneToMany(cascade=CascadeType.ALL)
#JoinColumn(name="PRODUCT_ID")
private List<Image> images;
#OneToMany(cascade=CascadeType.ALL)
#JoinColumn(name="PRODUCT_ID")
private List<Product> children;
#ManyToOne
#JoinColumn(name = "PARENT_PRODUCT_ID")
private Product parent;
Image.java:
#Entity
#Table
public class Image implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Column(name = "ID")
#GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer imageId;
#Column(name = "TYPE")
private String type;
#ManyToOne
#JoinColumn(name = "PRODUCT_ID", nullable = false)
private Product product;
In the oneToMany relationships, I think it should be like:
#OneToMany(cascade=CascadeType.ALL, mappedBy="parent")
private List<Product> children;

how to create table with 2 primary key fields hibernate

i'm trying to create tabel entity with composite primary key.
so i tried to create #Embeddable class with all the primary keys and use #EmbeddedId on the field that represents the primary keys. but i get this error:
Caused by: org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
i wos tried to follow this link bat noting work
what i'm doing wrong?
here is my code
DocEntity
#Entity(name = "doc")
#Table(name = "doc")
public class DocEntity extends baseDataBase implements Serializable
{
private static final long serialVersionUID = 1L;
#EmbeddedId
private DocID docID;
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Column(name = "DocID")
#JsonProperty
#NotEmpty
private short id;
#Column(name = "DocDescription")
#JsonProperty
#NotEmpty
private String docDescription;
#Column(name = "DocPath")
#JsonProperty
#NotEmpty
private String docPath;
// getters, setters ,equals, hashCode
}
DocID
#Embeddable
public class DocID implements Serializable
{
private static final long serialVersionUID = 1L;
#Column(name = "DocName")
#JsonProperty
#NotEmpty
protected String docName;
#Column(name = "DocVersion")
#JsonProperty
#NotEmpty
protected String docVersion;
// getters, setters ,equals, hashCode
}
what i'm doing wrong?

Entity without Primary Key ID

Hi I want to create an Entity which doesn't have an ID.
#Entity
#Table(name="USER_PROD_LIC_TYPE_ALL")
public class UserProdLicTypeAll {
#EmbeddedId
private UserProdLicTypeAllPK id;
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="USER_ID")
private User user;
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="LICENSE_TYPE_ID")
private LicenseType licType;
....
}
since it doesn't have primary key i created Embeddable class as below:
#Embeddable
public class UserProdLicTypeAllPK {
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="USER_ID")
private User user;
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="LICENSE_TYPE_ID")
private LicenseType licType;
...
}
The combination of these two fields returns a unique value.
But it doesn't work. I get
org.springframework.beans.factory.UnsatisfiedDependencyException: exception.
Do i need to have references in User and LicenseType entities for both UserProdLicTypeAll and UserProdLicTypeAllPK? I have tried that also but still it doesn't work.
This is my private hell. I'm not sure what the best way to solve it properly.
My best solution is:
#Entity
#Table(name = TableName.AREA_USER)
#IdClass(UserAreaPK.class)
public class UserArea implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Column(name = UserAreaPK.C_AREA_ID)
private Long areaId;
#Id
#Column(name = UserAreaPK.C_USER_ID)
private String userId;
#ManyToOne(fetch = FetchType.LAZY)
#JoinColumn(name = UserAreaPK.C_AREA_ID, insertable = false, updatable = false)
private Area area;
And
/**
* Primary key for the relationship User-Area
*/
public class UserAreaPK implements Serializable {
protected static final String C_AREA_ID = "area_id";
protected static final String C_USER_ID = "user_id";
private static final long serialVersionUID = 1L;
#Id
#Column(name = C_AREA_ID)
private Long areaId;
#Id
#Column(name = C_USER_ID)
private String userId;

JPA - #JoinColumn #ManyToOne to Class composed by PkClass

I'm trying to implement an internationalization class to translate contents from database.
I have these tables:
And I have theses classes:
ProductModel:
public class ProductModel implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#GeneratedValue(strategy = GenerationType.IDENTITY)
#Basic(optional = false)
#Column(name = "idproduct_model")
private Integer idproductModel;
#Size(max = 80, message = "El campo nombre esta vacio")
#Column(name = "name")
private String name;
#Size(max = 45, message = "El campo referencia esta vacio")
#Column(name = "productSuppReference")
private String productSuppReference;
...
Language:
public class LanguageCountry implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Basic(optional = false)
#NotNull
#Column(name = "id_language")
private Integer idLanguage;
#Basic(optional = false)
#NotNull
#Size(min = 1, max = 45)
#Column(name = "description")
private String description;
#OneToMany(cascade = CascadeType.ALL, mappedBy = "languageCountry1")
private List<ProductModelI18n> productModelI18nList;
...
ProductModelI18n:
public class ProductModelI18n implements Serializable {
private static final long serialVersionUID = 1L;
#EmbeddedId
protected ProductModelI18nPK productModelI18nPK;
#Size(max = 80)
#Column(name = "name")
private String name;
#Lob
#Size(max = 2147483647)
#Column(name = "description")
private String description;
#Size(max = 800)
#Column(name = "description2")
private String description2;
#JoinColumn(name = "language_country", referencedColumnName = "id_language", insertable = false, updatable = false)
#ManyToOne(optional = false)
private LanguageCountry languageCountry1;
ProductModelI18nPK:
#Embeddable
public class ProductModelI18nPK implements Serializable {
#Basic(optional = false)
#NotNull
#Column(name = "product_model")
private int productModel;
#Basic(optional = false)
#NotNull
#Column(name = "language_country")
private int languageCountry;
I have problems because I need a double PK in a ProductModelI18n table to get a manytomany relation between productmodel and languageCountry and now I don't know how to do a join table in productModel.
I need an ArrayList/Map in ProductModel class.
Thank you in advance!
Jose
EDIT:
Sorry my bad I missed the fact that you have extra columns in the Join table, so just need to decompose the ManyToMany association between ProductModel and LanguageCountry into two OneToMany associations.
Your code should look like:
in ProductModel class:
#OneToMany
private List<ProductModelI18n> ProductLanguages;
In LanguageCountry class:
#OneToMany
private List<ProductModelI18n> ProductLanguages;
And in your ProductModelI18n class:
Keep all the other fields including the IdPK and add the following declarations.
#ManyToOne
#PrimaryKeyJoinColumn(name="productModel", referencedColumnName="idproductModel")
private ProductModel productModels ;
#ManyToOne
#PrimaryKeyJoinColumn(name="languageCountry", referencedColumnName="idLanguage")
private LanguageCountry LanguageCountries;
Note:
Make sure you include all the getters and setters.
There's no need to create the class ProductModelI18n to make a ManyToMany relation between productmodel and languageCountry.
You only need two Collections in these two classes mapped with #ManyToMany annotation where in one of the two sides you define a #JoinTable here's the code you need:
In ProductModel class:
#ManyToMany
#JoinTable(
name="ProductModelI18n",
joinColumns={#JoinColumn(name="productModel", referencedColumnName="idproductModel")},
inverseJoinColumns={#JoinColumn(name="languageCountry", referencedColumnName="idLanguage")})
private List<LanguageCountry> languageCountries;
And in your LanguageCountry class:
#ManyToMany(mappedBy="languageCountries")
private List<ProductModel> productModels;
And you will get a Join table between the two tables as represented in the picture.
For further information you can take a look at:
JPA 2 Tutorial – Relationships – Many To Many.
Java Persistence/ManyToMany

Categories