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">
&l开发者_运维技巧t;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!
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.
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?
精彩评论