论坛首页 Java版 Hibernate

提问:unsaved的问题

浏览 1496 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2004-01-15
team类
[code:1]
public class team {
public team() {
}

private String name;
private Long team_id;
private Set players = new HashSet();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getPlayers() {
return players;
}
public void setPlayers(Set players) {
this.players = players;
}
public Long getTeam_id() {
return team_id;
}
public void setTeam_id(Long team_id) {
this.team_id = team_id;
}

public boolean equals(Object o) {
if (this == o)
return true;
if (this.team_id == null)
return false;
if (! (o instanceof Player))
return false;
team team = (team) o;
return this.team_id.equals(team.team_id);
}

public int hashCode() {
return this.team_id == null ? super.hashCode() : this.team_id.hashCode();
}


}
[/code:1]

Player类
[code:1]
public class Player {
public Player() {
}

private Long id;
private team belongTeam;
private String name;

public boolean equals(Object o) {
if (this == o)
return true;
if (this.id == null)
return false;
if (! (o instanceof Player))
return false;
Player c = (Player) o;
return this.id.equals(c.id);
}

public int hashCode() {
return this.id == null ? super.hashCode() : this.id.hashCode();
}

public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public team getBelongTeam() {
return belongTeam;
}
public void setBelongTeam(team belongTeam) {
this.belongTeam = belongTeam;
}


}
[/code:1]

Team.hbm.xml
[code:1]
<?xml version="1.0"?>
<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by sunliqun (ces) -->
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="team" table="TEAM">
<id name="team_id" column="TEAM_ID" type="java.lang.Long" unsaved-value="null">
<generator class="assigned">
</generator>
</id>
<property name="name" column="NAME" type="java.lang.String"/>
<set name="players" lazy="true" cascade="all-delete-orphan" inverse="true" sort="unsorted">
<key column="TEAM_ID"/>
<one-to-many class="Player"/>
</set>
</class>
</hibernate-mapping>
[/code:1]

Player.hbm.xml

[code:1]
<?xml version="1.0"?>
<!-- edited with XMLSPY v5 rel. 2 U (http://www.xmlspy.com) by sunliqun (ces) -->
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="Player" table="PLAYER">
<id name="id" column="PLAYER_ID" type="java.lang.Long" unsaved-value="none">
<generator class="sequence">
</generator>
</id>
<property name="name" column="NAME" type="java.lang.String"/>
<many-to-one name="belongTeam" class="team" cascade="save-update" column="TEAM_ID" />
</class>
</hibernate-mapping>
[/code:1]

测试代码

[code:1]
team t = (team)session.load(team.class,new Long(17));
// Player p = (Player)t.getPlayers().iterator().next();
Player p = new Player();
p.setName("!80887");
t.getPlayers().add(p);
session.update(t);
[/code:1]
现在的问题是,如果用Player p=(Player)t.getPlayers().interator().next()这段代码那么无论Player.hbm.xml中unsaved-value设置为什么,那么都是update;
而,如果注释掉这段代码而用后面这段代码,那么无论Player.hbm.xml中unsaved-value设置为什么,那么都是insert;
从上面的测试来看,好象只要是新建的对象就是insert,load上来的就是update
怎么和坛主说的不一样呢
请坛主解释一下.
   
时间:2004-01-16
引用

坛主水平真高,佩服!

楼上的兄弟,你是否听过"没有实践,就没有发言权" 这句话,你在没有实践之前,不要到处跟风,无论是自动分配的,还是手工分配的结果都是我说的那样
   
0 请登录后投票
时间:2004-01-17
[code:1]team t = (team)session.load(team.class,new Long(17));
// Player p = (Player)t.getPlayers().iterator().next();
Player p = new Player();
p.setName("!80887");
t.getPlayers().add(p);
session.update(t);
[/code:1]

加上一句
[code:1]
// Player p = (Player)t.getPlayers().iterator().next();
Player p = new Player();
p.setName("!80887");

p.setTeam(t);

t.getPlayers().add(p);
session.update(t);
[/code:1]
应该就可以了把
   
0 请登录后投票
时间:2004-01-17
加上那句,是用来维护外键的,如果不加这句,那么外键就是null
所以加不加,都是上面的结果,只是外键的结果不一样罢了
   
0 请登录后投票
时间:2004-01-17
所以我觉得unsaved-value只对save的时候起作用,而对其他操作无效
在有对于session.flush().这个语句我有点疑惑
[code:1]
team t = (team)session.load(team.class,new Long(18));
Player p = (Player)t.getPlayers().iterator().next();
// Player p = new Player();

p.setName("k6865kdkd");

t.getPlayers().add(p);
// p.setBelongTeam(t);
session.flush();
[/code:1]
这种方式只要flush一下,而前面不用显式的调用update(),那么它就会知道你要做什么,并发送相应的语句
而对于save的时候,你必须在flush之前调用save那么他才知道你要做insert操作,所以我现在想问的是flush是怎么一个操作过程[/quote]
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐