views:

478

answers:

2

Hi all, I've decided to change hbm.xml style to annotations using hibernate. I had in my 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's 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 session

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

Java code for saving Licence 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 hibernate doesn't save user on saving. I really need help!

+1  A: 

I'd suggest getting rid of the @Cascade annotation, unless you need delete-orphan.

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

Another thing to observe is whether you are using AnnotationConfiguration. If not, your annotations aren't parsed at all.

Update: Are you sure your user have the email field set? I'd suggest having an auto-generated id for the primary key of User. The email is the business key, on which hashCode() and equals() should be implemented.

Bozho
Its my first experience on stackoverflow and I like it for quick answers. Here is what I can add according to replies:1) cascade = {CascadeType.MERGE, CascadeType.PERSIST} - I tried it with no success
Denis
add these to your question, rather than as comments
Bozho
Sorry I its my first experience. I've added information to my question
Denis
A: 

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

dr jerry
Hi, I have added user class.
Denis