【发布时间】:2009-11-14 22:51:08
【问题描述】:
我正在尝试构建一个用户和一个联系人管理项目。 我有很多课程,所以将其限制在此处关注的内容。我有一个 userAccount、userProfile 和 group 这是 UserAccount 映射
@Id @GeneratedValue
@Column(name="USER_ACCOUNT_ID")
private Long ID;
......
@Column(name="EMAIL", length=100, unique=true)
private String email;
@OneToOne(targetEntity=UserProfileImpl.class,cascade={CascadeType.ALL})
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
@JoinColumn(name="USER_PROFILE_ID")
private UserProfile profile;
@OneToMany(targetEntity=GroupImpl.class, cascade={CascadeType.ALL})
// @JoinColumn(name="USER_ACCOUNT_ID")
@JoinTable(name = "USER_ACCOUNT_CONTACT_GROUP", joinColumns = @JoinColumn(name = "USER_ACCOUNT_ID"), inverseJoinColumns = @JoinColumn(name = "GROUP_ID"))
@org.hibernate.annotations.Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Group> groups = new HashSet<Group>();
........
这是用户资料
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="USER_PROFILE_ID")
private Long ID;
.....
@OneToOne(mappedBy="profile", targetEntity=UserAccountImpl.class)
private UserAccount userAccount;
.....
这里是组
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="GROUP_ID")
private Long ID;
.......
@Column(name="NAME", length=100, unique=true)
private String Name;
@ManyToOne(targetEntity=UserAccountImpl.class)
@JoinColumn(name="USER_ACCOUNT_ID",nullable=false)
private UserAccount userAccount;
所以基本上就是这样。在进行双向关联之前,一切都很顺利,将 userAccount 对象添加到 group.so 进行测试。我创建了 userProfile、userAccount 和组(使用 spring @autowired)。
在 setUP (@Before) 方法上,我为 userProfile 设置了一些道具,并将其与道具一起添加到 useAccount 并持久化,然后将 useAccount 设置为组。
在 tearDown(@After) 我删除 userACcount 。
在我的 testSave(保存组)上工作正常(对所有操作使用相同的会话),但在控制台上没有删除组的 sql 查询,但它删除了 userAccount。
通过在拆卸方法中删除 userAccount,我希望组应该被删除。但事实并非如此。
更糟糕的是,由于对组名的唯一限制,其他测试都失败了。我在网上搜索,但我尝试的一切似乎都不起作用。谁能救我:)?我的意思是我该怎么做?感谢阅读
这是根据我得到的响应对我所尝试的内容进行的更新。
我已将此添加到 group.setUserAccount(null) 到我的 removeGroup,现在是这个
public void removeGroup(Group group) {
try{
if(this.groups.contains(group)){
group.setUserAccount(null);
this.groups.remove(group);
}
} catch(Exception ex){
ex.printStackTrace();
}
}
所以对于我使用的具有相同行为的测试,即删除 userAccount 但不删除组
ua1.removeGroup(g1);
uaDao.delete(ua1);
我猜它没有进入 if 块,因为我应该有与这个相同的行为:
g1.setUserAccount(null);
uaDao.delete(ua1);
这个另一个抛出一个错误
PropertyValueException:非空属性引用空值或瞬态值
所以我想我会使用删除组:
gDao.delete(g1);
uaDao.delete(ua1);
希望我能找到解决方法。感谢帮助我的人,尤其是 Pascal,如果您有其他想法或发现我的代码有问题,我将非常乐意纠正它。谢谢阅读
【问题讨论】:
-
提供更多线索。我隔离了 testSave 方法并注释掉所有其余的方法。当我在拆解中对 userAccount 调用 delete 时,它会删除用户帐户和 userProfile 但不是组。所以我删除了首先在删除 UserAccount 中的组,然后那个也可以正常工作。但我不应该删除组,我只想删除将删除组的 userAccount。谢谢
标签: java unit-testing hibernate orm jpa