我决定使用hibernate将hbm.xml样式更改为注释。 我在我的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>
并将其更改为:
@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;
}
用户类:
@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代码
...
AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.configure(new File(PROPERTIES_FILENAME));
sessionFactory = cfg.buildSessionFactory();
...
用于保存许可证对象的Java代码
org.hibernate.Transaction t = session.beginTransaction();
session.saveOrUpdate(licence);
t.commit();
生成的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:工作代码
org.hibernate.Transaction t = session.beginTransaction();
session.save(licence.getUser());
session.save(licence);
t.commit();
并且hibernate不会保存用户。我真的需要帮助!
答案 0 :(得分:3)
除非您需要@Cascade
,否则我建议删除delete-orphan
注释。
仅使用cascade = {CascadeType.MERGE, CascadeType.PERSIST}
要注意的另一件事是你是否使用AnnotationConfiguration
。如果没有,则根本不解析您的注释。
更新:您确定自己的用户设置了email
字段吗?我建议为User
的主键设置一个自动生成的ID。 email
是业务密钥,应在其上实施hashCode()
和equals()
。
答案 1 :(得分:0)
您的用户是否被定义为实体?不确定它是否适用于hbm和注释混合。 关系是双向的吗?也许你可以展示用户类?