关于表的设计,或者hibernate映射问题

_忆_ 发布于 2013/08/31 13:53
阅读 324
收藏 0
我想设置这样的一个表,他有一个外键,这个外键可以对应多个表,比如(A表,B表,C表)有一个判断类型字段type,我想让这个外键可以对应多个表的主键,比如,type等于1时此时的外键对应的是A表的主键,类型type等于2时此时的外键对应的是B表的主键。请问怎么设置,如果使用hibernate来映射的话,怎么写映射文件。
加载中
0
zhouyanming
zhouyanming
@org.hibernate.annotations.Any
0
_忆_
_忆_
?不懂,能解析下吗
0
王正航
王正航
你可以用hibernate的对象继承和discriminator鉴别器实现,把有外键的这个表对应的model再继承出N个subclass,比如我们项目中的,Tariff、CategoryTariff extends Tariff、VideoTariff extends Tariff。在CategoryTariff是在type=0的情况下的子对象,它关联的是Category对象,VideoTariff在type=1的情况下关联的Video对象。
<class name="Tariff" table="TARIFF" discriminator-value="-1" dynamic-update="true">
		<id name="tariffId" type="java.lang.Long">
			<column name="TARIFF_ID" precision="22" scale="0" />
			<generator class="sequence">
				<param name="sequence">SEQ_TARIFF</param>
			</generator>
		</id>
		<discriminator column="TARIFF_TYPE" type="integer" insert="false" />
		<property name="name" type="java.lang.String">
			<column name="NAME" length="32" />
		</property>
		<subclass name="CategoryTariff" discriminator-value="0">
			<many-to-one name="category" column="SUBJECT_ID" insert="false" update="false" not-found="ignore" />
		</subclass>
		<subclass name="VideoTariff" discriminator-value="1">
			<many-to-one name="video" column="SUBJECT_ID" insert="false" update="false" not-found="ignore" />
		</subclass>
	</class>
如果你想实现双向关联,可以使用<properties name="modelKey">来做
<properties name="modelKey">
			<property name="type" type="java.lang.Integer" insert="false" update="false">
				<column name="TYPE" precision="8" scale="0" />
			</property>
			<property name="subjectId" type="java.lang.Long" insert="false" update="false">
				<column name="SUBJECT_ID" precision="22" scale="0" />
			</property>
		</properties>


0
_忆_
_忆_
你这建的是几张表? Tariff也建表?
0
王正航
王正航
三张表TARIFF、Category、Video,type在TARIFF上,TARIFF上有Category、Video的外键
0
王正航
王正航
我把代码贴给你看
以下是表结构:
create table TARIFF {
	TARIFF_ID int,
	TYPE int, --取值0、1
	SUBJECT_ID int, --type=0对应CATEGORY.CATEGORY_ID type=1时对应VIDEO.VIDEO_ID
	NAME VARCHAR2(100)
};

create table VIDEO {
	VIDEO_ID int,
	NAME VARCHAR2(100)
};

create table CATEGORY {
	CATEGORY_ID int,
	NAME VARCHAR2(100)
};

以下是hibernate model类结构:

public class Tariff implements serializable{
	private Integer tariffId;
	private Integer type;
	private Integer subjectId;
	private String name;
}

public class CategoryTariff extends Tariff{
	private Category category;
	
	public CategoryTariff(){
		this.type=0;
	}
}

public class VideoTariff extends Tariff{
	private Video video;
	
	public CategoryTariff(){
		this.type=1;
	}
}

public class Video implements serializable{
	private Integer videoId;
	private String name;
}

public class Category implements serializable{
	private Integer videoId;
	private String name;
}
以下是Tariff类的mapping文件,Video、Category类的我就不贴了,很简单,CategoryTariff、VideoTariff不需要mapping映射文件
<class name="Tariff" table="TARIFF" discriminator-value="-1" dynamic-update="true">
		<id name="tariffId" type="java.lang.Integer">
			<column name="TARIFF_ID" precision="8" scale="0" />
		</id>
		<discriminator column="type" type="integer" insert="false" />
		<property name="type" type="java.lang.Integer">
			<column name="type" precision="8" scale="0" />
		</property>
		<property name="subjectId" type="java.lang.Integer">
			<column name="SUBJECT_ID" precision="8" scale="0" />
		</property>
		<property name="name" type="java.lang.String">
			<column name="NAME" length="32" />
		</property>
		<subclass name="CategoryTariff" discriminator-value="0">
			<many-to-one name="category" column="SUBJECT_ID" insert="false" update="false" not-found="ignore" />
		</subclass>
		<subclass name="VideoTariff" discriminator-value="1">
			<many-to-one name="video" column="SUBJECT_ID" insert="false" update="false" not-found="ignore" />
		</subclass>
</class>
hibernate的子类功能非常方便,当你要从数据库中加载到Tariff后它自动给你转换成了相应的子类,使用时只需要强制类型转换即可。
0
王正航
王正航
当然你也可以使用from VideoTariff的语句从数据库中加载对象
0
_忆_
_忆_
没有具体数据的 Tariff也建一个表是不有点浪费?
0
王正航
王正航
Tariff有数据的, 可能你没明白我的意思吧,Tariff是我们的收费策略表,Video和Category是被收费对象。

我想设置这样的一个表,他有一个外键,这个外键可以对应多个表,比如(A表,B表,C表)有一个判断类型字段type,我想让这个外键可以对应多个表的主键。。。。


这个Tariff就是你说的“我想设置这样的一个表”啊

Tariff= 我想设置这样的一个表
Tariff.SUBJECT_ID就是你说的外键
Video=A表
Category=B表
这样说,明白点没
返回顶部
顶部