Cascading sleep annotations does not work

I decided to change the hbm.xml style to annotations using sleep mode. I had hbm.xml:

<hibernate-mapping package="by.sokol.jpr.data"> <class name="Licence"> <id name="licenceId"> <generator class="native" /> </id> <many-to-one name="user" lazy="false" cascade="save-update" column="usr"/> </class> </hibernate-mapping> 

And changed it to:

 @Entity public class Licence { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int licenceId; @ManyToOne(targetEntity=User.class, fetch=FetchType.EAGER, cascade = CascadeType.ALL) @Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE }) private User user; } 

User Class:

 @Entity(name = "Usr") public class User { // BEGIN user info @Basic private String uid; @Basic private String name; @Basic private String company; @Basic private String street; // user zip code @Basic private String ubication; @Basic private String city; @Basic private String po; @Column(name = "useremail") @Id @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "assignedGen") @GenericGenerator(name = "assignedGen", strategy = "assigned") private String email; @Basic private String challengPassword; @Basic private String serialNumber; } 

Hibernate.cfg.xml

 ... <mapping class="by.sokol.jpr.data.Licence" /> <mapping class="by.sokol.jpr.data.User" /> ... 

Java code to get the session

 ... AnnotationConfiguration cfg = new AnnotationConfiguration(); cfg.configure(new File(PROPERTIES_FILENAME)); sessionFactory = cfg.buildSessionFactory(); ... 

Java code to save a license object

 org.hibernate.Transaction t = session.beginTransaction(); session.saveOrUpdate(licence); t.commit(); 

generated sql:

 Hibernate: select this_.licenceId as licenceId0_2_, this_.creationDate as creation2_0_2_, this_.limitDate as limitDate0_2_, this_.user_useremail as user4_0_2_, this_.workstation_motherboardId as workstat5_0_2_, user1_.useremail as useremail1_0_, user1_.challengPassword as challeng2_1_0_, user1_.city as city1_0_, user1_.company as company1_0_, user1_.name as name1_0_, user1_.po as po1_0_, user1_.serialNumber as serialNu7_1_0_, user1_.street as street1_0_, user1_.ubication as ubication1_0_, user1_.uid as uid1_0_, workstatio4_.motherboardId as motherbo1_2_1_, workstatio4_.computerName as computer2_2_1_, workstatio4_.macAddress as macAddress2_1_, workstatio4_.osId as osId2_1_ from Licence this_ inner join Usr user1_ on this_.user_useremail=user1_.useremail left outer join Workstation workstatio4_ on this_.workstation_motherboardId=workstatio4_.motherboardId where user1_.useremail=? Hibernate: select nextval ('hibernate_sequence') Hibernate: insert into Licence (creationDate, limitDate, user_useremail, workstation_motherboardId, licenceId) values (?, ?, ?, ?, ?) 

APPEND_1: working code

 org.hibernate.Transaction t = session.beginTransaction(); session.save(licence.getUser()); session.save(licence); t.commit(); 

And sleep mode does not save the user when saving. I really need some help!

+4
source share
2 answers

I suggest getting rid of the @Cascade annotation if you don't need delete-orphan .

use only cascade = {CascadeType.MERGE, CascadeType.PERSIST}

Another thing to keep in mind is whether you use AnnotationConfiguration . If not, your annotations are not processed at all.

Update: Are you sure you have the email field set? I would suggest creating an automatically generated identifier for the primary key User . email is the business key on which hashCode() and equals() should be implemented.

+3
source

Is your user defined as an object? Not sure if it works with hbm and annotations. Is the relation bidirectional? Maybe you can show the user class?

0
source

Source: https://habr.com/ru/post/1305459/


All Articles