急问Hibernate的多对多关系?

masse 2007-12-27 01:59:35
-- 小组
Team(id INT)

-- 人员
Person( id INT )

-- 工作
Job(id INT)

-- 小组和人员的多对多关系
Team_Person(
teamId INT,
personId INT,
FOREIGN KEY(teamId) REFERENCES Team(id),
FOREIGN KEY(personId) REFERENCES Person(id)
)

--人员和工作的多对多关系
Person_Job(
personId INT,
jobId INT,
FOREIGN KEY(personId) REFERENCES Person(id),
FOREIGN KEY(jobId) REFERENCES Job(id)
)


以上就是数据库,


我自己定义了一些Dao,请问如何得到一个Team下的人从事的所有工作?
public List<Job> getJobs(Team team){
// TODO:
}
...全文
499 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sou2012 2008-12-13
  • 打赏
  • 举报
回复
正在学习JPA!

讲解的精彩!
睿音 2007-12-29
  • 打赏
  • 举报
回复
对。所有的关系都需要自己去控制。
masse 2007-12-29
  • 打赏
  • 举报
回复
to pizzame :

如果这样定义,我删除了一个Team,是不是需要再写一部分代码去删除对应的关系,而不能自动删除?
睿音 2007-12-27
  • 打赏
  • 举报
回复
不赞成在model中体现关系!!那样会增加系统的耦合度!!
关系完全体现在DAO层里。
如果想得到一个Team下的人从事的所有工作

//DAO
public List findJobByPerson(long personId){
final String queryString = "select model from Job model,Teamperson tp,Personjob pj where ((tp.personId = :personId) and (tp.teamId = pj.teamId) and(model.jobId = pj.jobId)";
Query qy=getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(queryString);
qy.setParameter("personId", personId);
return qy.getResultList();
}

希望这次没有笔误
睿音 2007-12-27
  • 打赏
  • 举报
回复
更正笔误~~

//关系实体小组和人员的关系
@Entity
@Table(name="team-person")
public class Teamperson{
@Id
@Column(name = "teamperson_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long teampersonId;
@Column(name = "team_id", unique = false, nullable = false, insertable = true, updatable = true)
private long teamId;
@Column(name = "person_id", unique = false, nullable = false, insertable = true, updatable = true)
private long personId;

//构造方法,get set方法.
}

jammychen 2007-12-27
  • 打赏
  • 举报
回复
可在模型上注解多对多关系啊

@ManyToMany(
targetEntity = Team.class,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.EAGER
)
@JoinTable(
name="Team_Person",
joinColumns={@JoinColumn(name="teamId")},
inverseJoinColumns={@JoinColumn(name="personId")}
)
睿音 2007-12-27
  • 打赏
  • 举报
回复
将多对多的关系进行拆分就是将逻辑业务关系在业务层代码中表现出来并不体现在实体中,所有关系通过Service层来体现。目的是解偶。多对多关系按照业务关系一般拆分成多对一就可以了,一对一的关系性能不佳。
lz的实体这样进行拆分:

//三个实体不变
@Entity
@Table(name="team")
public class Team{
@Id
@Column(name = "team_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long teamId;

//构造方法,get set方法.
}

@Entity
@Table(name="person")
public class Person{
@Id
@Column(name = "person_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long personId;

//构造方法,get set方法.
}

@Entity
@Table(name="job")
public class Job{
@Id
@Column(name = "job_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long jobId;

//构造方法,get set方法.
}

//关系实体小组和人员的关系
@Entity
@Table(name="team-job")
public class Teamjob{
@Id
@Column(name = "teamjob_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long teamjobId;
@Column(name = "team_id", unique = false, nullable = false, insertable = true, updatable = true)
private long teamId;
@Column(name = "job_id", unique = false, nullable = false, insertable = true, updatable = true)
private long jobId;

//构造方法,get set方法.
}

//关系实体人员和工作的关系
@Entity
@Table(name="person-job")
public class Personjob{
@Id
@Column(name = "personjob_id", unique = true, nullable = false, insertable = true, updatable = true)
@GeneratedValue(strategy=GenerationType.AUTO)
private long personjobId;
@Column(name = "person_id", unique = false, nullable = false, insertable = true, updatable = true)
private long personId;
@Column(name = "job_id", unique = false, nullable = false, insertable = true, updatable = true)
private long jobId;
}

masse 2007-12-27
  • 打赏
  • 举报
回复
请问楼上改如何拆分呢?
下面是我的部分Java类代码,
请问拆分之后,注解该如何写?

或者给点资料也行



@Entity
public class Team{
private int id;
@Id
public int getId(){return id;}
}

@Entity
public class Person{
private int id;
@Id
public int getId(){return id;}
}

@Entity
public class Job{
private int id;
@Id
public int getId(){return id;}
}
xql80329 2007-12-27
  • 打赏
  • 举报
回复
hibernate 多对多 要拆成 多对一 一对多
cmrj2ee 2007-12-27
  • 打赏
  • 举报
回复
int[] array ;
ResultSet rs= select personId from Team_Person where teamId = 1;
while(rs.next()){
array = (int)rs.getInt(0);
}

String srcSQL = “select * from job where personId in (” ;

public static String createSQL(int[] array, String srcSQL) {
String produceSQL = srcSQL;
for (int i = 0; i < array.length; i++) {
if (i == array.length - 1)
produceSQL = produceSQL + array[i] + ")";
else
produceSQL = produceSQL + array[i] + ",";
}
return produceSQL;
}
我以前是这样解决类似问题得,希望大家有更好得办法。
masse 2007-12-27
  • 打赏
  • 举报
回复
主要是里面的那个HQL该如何写?

"From Job where" ....

后面该怎么写呢

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧