我有一个问题,需要你的帮助来解决这个问题。希望这个胎面可以成为类似问题的参考……</p>
在我最小化的业务模型中,有用户和标题。Title 应该先创建,并且可以分配给多个用户,并且用户可以共享相同的 Title。因此,我创建了两个名为 User 和 Title 的实体,它们具有 @ManyToMany 关系,并决定 Title 应该拥有这种关系。此外,我有一个 UnitTest 来运行这个示例。
用户实体
public class User {
Long id;
String name;
Set<Title> titles = new HashSet<Title>();
@Id
@GeneratedValue
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/*============ Approach1 ============*/
// @ManyToMany(mappedBy = "users")
/*============ Approach2 ============*/
// @ManyToMany
/*============ Approach3 ============*/
@ManyToMany
@JoinTable( name = "tb_title_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "title_id"))
public Set<Title> getTitles() {
return titles;
}
public void setTitles(Set<Title> titles) {
this.titles = titles;
}
}
标题实体
public class Title {
Long id;
String description;
Set<User> users = new HashSet<User>();
@Id
@GeneratedValue
@Column(name = "id")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/*============ Approach1 & Approach2 & Approach3 ============*/
@ManyToMany
@JoinTable( name = "tb_title_user",
joinColumns = @JoinColumn(name = "title_id"),
inverseJoinColumns = @JoinColumn(name = "user_id"))
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
单元测试
public class UserTest {
@Autowired
private SessionFactory sessionFactory;
@Test
@Rollback(false)
@Transactional
public void saveUser(){
Session session = sessionFactory.getCurrentSession();
String now = new Date().toString();
Title title = new Title();
title.setDescription("TitleDescription: " + now);
session.save(title);
User user = new User();
user.setName("UserName: " + now);
user.getTitles().add(title);
session.saveOrUpdate(user);
}
}
如果您查看上面的代码,您将看到三种不同的方法。下面描述了数据是否正确存储在数据库表中:
Title User JoinTable
Approach1 Yes Yes No
Approach2 Yes Yes Yes
Approach3 Yes Yes Yes
以下是我对每种方法的想法:
方法1
根据 Hibernate 文档(http://docs.jboss.org/hibernate/core/4.1/manual/en-US/html/ch07.html#d5e5537),我应该遵循 Approach1。特别是,因为文档明确提到:
“如前所述,对方不必(不得)描述物理映射:包含所有者方属性名称的简单 mappedBy 参数将两者绑定。”</p>
如果我理解正确,我不必(不得)在 User 实体中添加 @JoinTable。
方法2
它可以工作,但它忽略了我的 @JoinTable 定义并创建了自己的名为: 的表tb_user_tb_title
。我闻起来很腥。
方法3
它有效,但文档说不要使用它。因此,在我看来,我可能会后悔在企业产品中使用这种方法。